Go to the first, previous, next, last section, table of contents.

# F MySQL change history

This appendix lists the changes from version to version in the MySQL source code.

新しい変更を MySQL に施すと同時に、マニュアルを変更することに注意してください。 もしマニュアルにかかれているのに MySQL download page に 新しいバージョンの MySQL が見つからない場合、そのバージョンはまだリリースされていません！

## F.1 Changes in release 4.0.x (Development; Alpha)

我々はMySQL 4.0の作業を開始しています。皆さんが我々の開発に追随できるように、この章の内容は新しい機能が追加される度に更新されていきます。

TODOの節には我々が4.0で開発予定の項目が含まれています。 「1.6.1 Things that should be in 4.0」節参照.

### F.1.1 Changes in release 4.0.0

- Multi-table `DELETE`.
- Don't support old client protocols prior to MySQL 3.21 any more.
- Don't include the old C API functions `mysql_drop_db`, `mysql_create_db` and `mysql_connect`, unless compiled with `USE_OLD_FUNCTIONS`.
- Renamed `safe_mysqld` to `mysqld_safe`.
- Allow `IN` as a synonym for `FROM` in `SHOW` commands.
- `SHOW INDEXES` is now a synonym for `SHOW INDEX`.
- Added support for symbolic links to `MyISAM` tables. Symlink handling is now enabled by default for Windows.
- `LOAD DATA FROM MASTER` ``auto-magically'' sets up a slave.
- A new `HANDLER` interface to `MyISAM` tables.
- `COUNT(DISTINCT)` is about 30% faster.
- `FULLTEXT` index creation now is much faster.
- Searching on packed (`CHAR`/`VARCHAR`) keys now is much faster.
- Added `SQL_CALC_FOUND_ROWS` and `FOUND_ROWS()`. This makes it possible to know how many rows a query would have returned without a `LIMIT` clause.
- Changed output format of `SHOW OPEN TABLES`.
- Allow `SELECT expression LIMIT ...`.
- Added `IDENTITY` as a synonym for `AUTO_INCREMENT` (like Sybase).
- Added `ORDER BY` syntax to `UPDATE` and `DELETE`.
- Optimized queries of type: `SELECT DISTINCT * from table_name ORDER by key_part1 LIMIT #`

## F.2 Changes in release 3.23.x (Stable)

The 3.23 release has several major features that are not present in previous versions. We have added three new table types:

MyISAM
  A new ISAM library which is tuned for SQL and supports large files.
BerkeleyDB or BDB
  Uses the Berkeley DB library from Sleepycat Software to implement transaction-safe tables.
InnoDB
  A transaction-safe table handler that supports row level locking, and many Oracle-like features.

Note that only MyISAM is available in the standard binary distribution.

The 3.23 release also includes support for database replication between a master and many slaves, full-text indexing, and much more.

All new features are being developed in the 4.0 version. Only bug fixes and minor enhancements to existing features will be added to 3.23.

The replication code and BerkeleyDB code is still not as tested and as the rest of the code, so we will probably need to do a couple of future releases of 3.23 with small fixes for this part of the code. As long as you don't use these features, you should be quite safe with MySQL 3.23!

Note that the above doesn't mean that replication or Berkeley DB don't work; We have done a lot of testing of all code, including replication and BDB without finding any problems. It only means that not as many users use this code as the rest of the code and because of this we are not yet 100% confident in this code.

### F.2.1 Changes in release 3.23.49

- Don't give warning for statement that is only a comment; This is needed for `mysqldump --disable-keys` to work.
- Fixed unlikely caching bug when doing a join without keys. In this case the last used field for a table always returned `NULL`.
- Added options to make `LOAD DATA LOCAL INFILE` more secure.
- MySQL binary release 3.23.48 for Linux contained a new glibc library, which has serious problems under high load and RedHat 7.2. The 3.23.49 binary release doesn't have this problem.

### F.2.2 Changes in release 3.23.48

- Changed to use `autoconf` 2.52 (from `autoconf` 2.13)
- Fixed bug in complicated join with `const` tables.
- Added internal safety checks for InnoDB.
- Some InnoDB variables was always shown in `SHOW VARIABLES` as `OFF` on high-byte-first systems (like sparc).
- Fixed problem with one thread using an InnoDB table and another thread doing an `ALTER TABLE` on the same table. Before that, mysqld could crash with an assertion failure in row0row.c, line 474.
- Tuned the InnoDB SQL optimizer to favor more often index searches over table scans.
- Fixed a performance problem with InnoDB tables when several large SELECT queries are run concurrently on a multiprocessor Linux computer. Large CPU-bound SELECT queries will now also generally run faster on all platforms.
- If MySQL binlogging is used, InnoDB now prints after crash recovery the latest MySQL binlog name and the offset InnoDB was able to recover to. This is useful, for example, when resynchronizing a master and a slave database in replication.
- Added better error messages to help in installation problems of InnoDB tables.
- One can now recover also MySQL temporary tables which have become orphaned inside the InnoDB tablespace.
- InnoDB now prevents a `FOREIGN KEY` declaration where the signedness is not the same in the referencing and referenced integer columns.
- Calling `SHOW CREATE TABLE` or `SHOW TABLE STATUS` could cause memory corruption and make mysqld to crash. Especially at risk was `mysqldump`, because it calls frequently `SHOW CREATE TABLE`.
- If inserts to several tables containing an auto-inc column were wrapped inside one `LOCK TABLES`, InnoDB asserted in lock0lock.c.
- In 3.23.47 we allowed several `NULLS` in a `UNIQUE` secondary index for an InnoDB table. But `CHECK TABLE` was not relaxed: it reports the table as corrupt. `CHECK TABLE` no longer complains in this situation.
- `SHOW GRANTS` now shows `REFERENCES` instead of `REFERENCE`.

### F.2.3 Changes in release 3.23.47

- Fixed in when using the following construct: `SELECT ... WHERE key=@var_name OR $key=@var_name2`
- Restrict InnoDB keys to 500 bytes.
- InnoDB now supports `NULL` in keys.
- Fixed shutdown problem on HPUX. (Introduced in 3.23.46)
- Fixed core-dump bug in replication when using SELECT RELEASE_LOCK();
- Added new command: `DO expression,[expression]`
- Added `slave-skip-errors` option
- Added statistics variables for all MySQL commands. (`SHOW STATUS` is now much longer).
- Fixed default values for InnoDB tables.
- Fixed that `GROUP BY expr DESC` works.
- Fixed bug when using `t1 LEFT JOIN t2 ON t2.key=constant`.
- `mysql_config` now also work with binary (relocated) distributions.

### F.2.4 Changes in release 3.23.46

- Fixed problem with aliased temporary tables replication
- InnoDB and BDB tables will now use index when doing an `ORDER BY` on the whole table.
- Fixed bug where one got an empty set instead of a DEADLOCK error when using BDB tables.
- One can now kill `ANALYZE`,`REPAIR` and `OPTIMIZE TABLE` when the thread is waiting to get a lock on the table.
- Fixed race condition in `ANALYZE TABLE`.
- Fixed bug when joining with caching (unlikely to happen).
- Fixed race condition when using the binary log and `INSERT DELAYED` which could cause the binary log to have rows that was not yet written to MyISAM tables.
- Changed caching of binary log to make replication slightly faster.
- Fixed bug in replication on Mac OS X.

### F.2.5 Changes in release 3.23.45

- `(UPDATE|DELETE) ...WHERE MATCH` bugfix
- shutdown should now work on Darwin (Mac OS X).
- Fixed core-dump when repairing corrupted packed MyISAM files.
- `--core-file` now works on Solaris.
- Fix a bug which could cause InnoDB to complain if it cannot find free blocks from the buffer cache during recovery.
- Fixed bug in InnoDB insert buffer B-tree handling that could cause crashes.
- Fixed bug in InnoDB lock timeout handling.
- Fixed core dump bug in `ALTER TABLE` on a `TEMPORARY` InnoDB table.
- Fixed bug in `OPTIMIZE TABLE` that reset index cardinality if it was up to date.
- Fixed problem with `t1 LEFT_JOIN t2 ... WHERE t2.date_column IS NULL` when date_column was declared as `NOT NULL`.
- Fixed bug with BDB tables and keys on `BLOB`'s.
- Fixed bug in `MERGE` tables on OS with 32 bit file pointers.
- Fixed bug in `TIME_TO_SEC()` when using negative values.

### F.2.6 Changes in release 3.23.44

- Fixed `Rows_examined` count in slow query log.
- Fixed bug when using a reference to a `AVG()` column in `HAVING`.
- Fixed that date functions that require correct dates, like `DAYOFYEAR(column)` will return `NULL` for `0000-00-00` dates.
- Fixed bug in const-propagation when comparing columns of different types. (`SELECT * FROM date_col="2001-01-01" and date_col=time_col`)
- Fixed bug that caused error message `Can't write, because of unique constraint` with some `GROUP BY` queries.
- SJIS において、テーブル名、フィールド名をバッククオートで囲んだ場合の問題を修正
- Fixed coredump when using `CREATE ... FULLTEXT` keys with other table handlers than MyISAM.
- Add missing `InnoDB` variables to `SHOW VARIABLES`.
- Foreign keys checking is now done for `InnoDB` tables.
- Don't use `signal()` on windows because this appears to not be 100 % reliable.
- Fixed bug when doing `WHERE column_name=NULL` on an indexed column that had `NULL` values.
- Fixed bug when doing `LEFT JOIN ... ON (column_name = constant) WHERE column_name = constant`.
- When using replications, aborted queries that contained `%` could cause a core dump.
- `TCP_NODELAY` がいくつかのシステムで使用されていなかったのを修正(TCP 通信時の速度低下の問題).
- Applied portability fixes for OS/2 (Patch by Yuri Dario).

### F.2.7 Changes in release 3.23.43

- Fixed a bug in `INSERT DELAYED` and `FLUSH TABLES` introduced in 3.23.42.
- Fixed unlikely bug, which returned not matching rows, in SELECT with many tables and multi-column indexes and 'range' type.
- Fixed a unlikely core-dump bug when doing `EXPLAIN SELECT` when using many tables and `ORDER BY`.
- Fixed bug in `LOAD DATA FROM MASTER` when using table with `CHECKSUM=1`.
- Added unique error message when one gets a DEADLOCK during a transaction with BDB tables.
- Fixed problem with `BDB` tables and `UNIQUE` columns defined as `NULL`.
- Fixed problem with `myisampack` when using pre-space filled CHAR columns.
- Applied patch from Yuri Dario for OS2.
- Fixed bug in `--safe-user-create`

### F.2.8 Changes in release 3.23.42

- Fixed problem when using `LOCK TABLES` and `BDB` tables.
- Fixed problem with `REPAIR TABLE` on MyISAM tables with row lengths between 65517 - 65520 bytes
- Fixed rare hang when doing `mysqladmin shutdown` when there was a lot of activity in other threads.
- Fixed problem with `INSERT DELAYED` where delay thread could be hanging on `upgrading locks` without any apparent reasons.
- Fixed problem with `myisampack` and `BLOB`.
- Fixes problem when one edited `.MRG` tables by hand. (Patch from Benjamin Pflugmann).
- Enforce that all tables in a `MERGE` table come from the same database.
- Fixed bug with `LOAD DATA INFILE` and transactional tables.
- Fix bug when using `INSERT DELAYED` with wrong column definition.
- Fixed coredump during `REPAIR` of some particularly broken tables.
- Fixed bug in `InnoDB` and `AUTO_INCREMENT` columns.
- Fixed bug in `InnoDB` and `RENAME TABLE` columns.
- Fixed critical bug in `InnoDB` and `BLOB` columns. If one has used `BLOB` columns larger than 8000 bytes in an `InnoDB` table, one must dump the table with `mysqldump`, drop it and restore it from the dump.
- Applied large patch for OS/2 from Yuri Dario.
- Fixed problem with `InnoDB` when one could get the error `Can't execute the given command...` even when one didn't have an active transaction.
- Applied some minor fixes that concern Gemini.
- Use real arithmetic operations even in integer context if not all arguments are integers. (Fixes uncommon bug in some integer contexts).
- Don't force everything to lower cases on Windows. (To fix problem with Windows and `ALTER TABLE`). Now `--lower_case_names` also works on Unix.
- Fixed that automatic rollback that is done when thread end doesn't lock other threads.

### F.2.9 Changes in release 3.23.41

- Added option `--sql-mode=option[,option[,option]]`. 「4.1.1 mysqld コマンド行オプション」節参照.
- Fixed possible problem with `shutdown` on Solaris where the ``.pid'` file wasn't deleted.
- InnoDB now supports < 4 GB rows. The former limit was 8000 bytes.
- The `doublewrite` file flush method is used in `InnoDB`. It reduces the need for Unix fsync calls to a fraction and improves performance on most Unix flavors.
- You can now use the `InnoDB` Monitor to print a lot of InnoDB state information, including locks, to the standard output; useful in performance tuning.
- Several bugs which could cause hangs in `InnoDB` have been fixed.
- Split `record_buffer` to `record_buffer` and `record_rnd_buffer`. To make things compatible to previous MySQL versions, if `record_rnd_buffer` is not set, then it takes the value of `record_buffer`.
- Fixed optimizing bug in `ORDER BY` where some `ORDER BY` parts where wrongly removed.
- Fixed overflow bug with `ALTER TABLE` and `MERGE` tables.
- Added prototypes for `my_thread_init()` and `my_thread_end()` to ``mysql_com.h'`
- Added option `--safe-user-create` to `mysqld`.
- Fixed bug in `SELECT DISTINCT ... HAVING` that casued error message `Can't find record in '#...`

### F.2.10 Changes in release 3.23.40

- Fixed problem with `--low-priority-updates` and `INSERT`'s.
- Fixed bug in slave thread when under some rare circumstances it could get 22 bytes ahead on the offset in the master.
- Added `slave_wait_timeout` for replication.
- Fixed problem with `UPDATE` and `BDB` tables.
- Fixed hard bug in `BDB` tables when using key parts.
- Fixed problem when using the `GRANT FILE ON database.* ...`; Previously we added the `DROP` privilege for the database.
- Fixed `DELETE FROM table_name ... LIMIT 0` and `UPDATE FROM table_name ... LIMIT 0` acted as though the `LIMIT` clause was not present (they deleted or updated all selected rows).
- `CHECK TABLE` now checks if an `AUTO_INCREMENT` column contains the value 0.
- Sending a `SIGHUP` to `mysqld` will now only flush the logs, not reset the replication.
- Fixed parser to allow floats of type `1.0e1` (no sign after `e`).
- Option `--force` to `myisamchk` now also updates states.
- Added option `--warnings` to `mysqld`. Now `mysqld` only prints the error `Aborted connection` if this option is used.
- Fixed problem with `SHOW CREATE TABLE` when you didn't have a `PRIMARY KEY`.
- Properly fixed the rename of `innodb_unix_file_flush_method` to `innodb_flush_method`.
- Fixed bug when converting `UNSIGNED BIGINT` to `DOUBLE`. This caused a problem when doing comparisons with `BIGINT` values outside of the signed range.
- Fixed bug in `BDB` tables when querying empty tables.
- Fixed a bug when using `COUNT(DISTINCT)` with `LEFT JOIN` and there wasn't any matching rows.
- Removed all documentation referring to the `GEMINI` table type. `GEMINI` is not released under an Open Source license.

### F.2.11 Changes in release 3.23.39

- The `AUTO_INCREMENT` sequence wasn't reset when dropping and adding an `AUTO_INCREMENT` column.
- `CREATE ... SELECT` now creates non-unique indexes delayed.
- Fixed problem where `LOCK TABLES table_name READ` followed by `FLUSH TABLES` put an exclusive lock on the table.
- `REAL` @variables with was represented with 2 digits when converted to strings.
- Fixed problem that client 'hung' when `LOAD TABLE FROM MASTER` failed.
- Running `myisamchk --fast --force` will no longer repair tables that only had the open count wrong.
- Added functions to handle symbolic links to make life easier in 4.0.
- We are now using the `-lcma` thread library on HP-UX 10.20 so that MySQL will be more stable on HP-UX.
- Fixed problem with `IF()` and number of decimals in the result.
- Fixed date-part extraction functions to work with dates where day and/or month is 0.
- Extended argument length in option files from 256 to 512 chars.
- Fixed problem with shutdown when `INSERT DELAYED` was waiting for a `LOCK TABLE`.
- Fixed coredump bug in `InnoDB` when tablespace was full.
- Fixed problem with `MERGE` tables and big tables (> 4G) when using `ORDER BY`.

### F.2.12 Changes in release 3.23.38

- Fixed a bug when `SELECT` from `MERGE` table sometimes results in incorrectly ordered rows.
- Fixed a bug in `REPLACE()` when using the ujis character set.
- Applied Sleepycat BDB patches 3.2.9.1 and 3.2.9.2.
- Added option `--skip-stack-trace` to `mysqld`.
- `CREATE TEMPORARY` now works with `InnoDB` tables.
- `InnoDB` now promotes sub keys to whole keys.
- Added option `CONCURRENT` to `LOAD DATA`.
- Better error message when slave `max_allowed_packet` is too low to read a very long log event from the master.
- Fixed bug when too many rows where removed when using `SELECT DISTINCT ... HAVING`.
- `SHOW CREATE TABLE` now returns `TEMPORARY` for temporary tables.
- Added `Rows_examined` to slow query log.
- Fixed problems with function returning empty string when using together with a group functions and a `WHERE` that didn't match any rows.
- New program `mysqlcheck`.
- Added database name to output for administrative commands like `CHECK`, `REPAIR`, `OPTIMIZE`.
- Lots of portability fixes for `InnoDB`.
- Changed optimizer so that queries like `SELECT * FROM table_name,table_name2 ... ORDER BY key_part1 LIMIT #` will use index on `key_part1` instead of `filesort`.
- Fixed bug when doing `LOCK TABLE to_table WRITE,...; INSERT INTO to_table... SELECT ...` when `to_table` was empty.
- Fixed bug with `LOCK TABLE` and BDB tables.

### F.2.13 Changes in release 3.23.37

- Fixed a bug when using `MATCH` in `HAVING` clause.
- Fixed a bug when using `HEAP` tables with `LIKE`.
- Added `--mysql-version` to `safe_mysqld`
- Changed `INNOBASE` to `InnoDB` (because the `INNOBASE` name was already used). All `configure` options and `mysqld` start options are now using `innodb` instead of `innobase`. This means that you have to change any configuration files where you have used `innobase` options before upgrading to this version!
- Fixed bug when using indexes on `CHAR(255) NULL` columns.
- Slave thread will now be started even if `master-host` is not set, as long as `server-id` is set and valid `master.info` is present
- Partial updates (terminated with kill) are now logged with a special error code to the binary log. Slave will refuse to execute them if the error code indicates the update was terminated abnormally, and will have to be recovered with `SET SQL_SLAVE_SKIP_COUNTER=1; SLAVE START` after a manual sanity check/correction of data integrity.
- Fixed bug that erroneously logged a drop of internal temporary table on thread termination to the binary log - bug affected replication.
- Fixed a bug in `REGEXP()` on 64-bit machines.
- `UPDATE` and `DELETE` with `WHERE unique_key_part IS NULL` didn't update/delete all rows.
- Disabled `INSERT DELAYED` for tables that support transactions.
- Fixed bug when using date functions on `TEXT`/`BLOB` column with wrong date format.
- UDFs now also work on Windows. (Patch by Ralph Mason)
- Fixed bug in `ALTER TABLE` and `LOAD DATA INFILE` that disabled key-sorting. These commands should now be faster in most cases.
- Fixed performance bug where reopened tables (tables that had been waiting for `FLUSH` or `REPAIR`) would not use indexes for the next query.
- Fixed problem with `ALTER TABLE` to Innobase tables on FreeBSD.
- Added `mysqld` variables `myisam_max_sort_file_size` and `myisam_max_extra_sort_file_size`.
- Initialize signals early to avoid problem with signals in Innobase.
- Applied patch for the `tis620` character set to make comparisons case-independent and to fix a bug in `LIKE` for this character set. NOTE: All tables that uses the `tis620` character set must be fixed with `myisamchk -r` or `REPAIR TABLE` !
- Added `--skip-safemalloc` option to `mysqld`.

### F.2.14 Changes in release 3.23.36

- Fixed a bug that allowed you to use database names containing a ``.'` character. This fixes a serious security issue when `mysqld` is run as root.
- Fixed bug when thread creation failed (could happen when doing a LOT of connections in a short time).
- Fixed some problems with `FLUSH TABLES` and `TEMPORARY` tables. (Problem with freeing the key cache and error `Can't reopen table...`).
- Fixed a problem in Innobase with other character sets than `latin1` and another problem when using many columns.
- Fixed bug that caused a core dump when using a very complex query involving `DISTINCT` and summary functions.
- Added `SET TRANSACTION ISOLATION LEVEL ...`
- Added `SELECT ... FOR UPDATE`.
- Fixed bug where the number of affected rows was not returned when `MySQL` was compiled without transaction support.
- Fixed a bug in `UPDATE` where keys weren't always used to find the rows to be updated.
- Fixed a bug in `CONCAT_WS()` where it returned wrong results.
- Changed `CREATE ... INSERT` and `INSERT ... SELECT` to not allow concurrent inserts as this could make the binary log hard to repeat. (Concurrent inserts are enabled if you are not using the binary or update log).
- Changed some macros to be able to use fast mutex with glibc 2.2.

### F.2.15 Changes in release 3.23.35

- Fixed newly introduced bug in `ORDER BY`.
- Fixed wrong define `CLIENT_TRANSACTIONS`.
- Fixed bug in `SHOW VARIABLES` when using `INNOBASE` tables.
- Setting and using user variables in `SELECT DISTINCT` didn't work.
- Tuned `SHOW ANALYZE` for small tables.
- Fixed handling of arguments in the benchmark script ``run-all-tests'`.

### F.2.16 Changes in release 3.23.34a

- Added extra files to the distribution to allow `INNOBASE` support to be compiled.

### F.2.17 Changes in release 3.23.34

- Added the `INNOBASE` table handler and the `BDB` table handler to the MySQL source distribution.
- Updated the documentation about `GEMINI` tables.
- Fixed a bug in `INSERT DELAYED` that caused threads to hang when inserting `NULL` into an `AUTO_INCREMENT` column.
- Fixed a bug in `CHECK TABLE` / `REPAIR TABLE` that could cause a thread to hang.
- `REPLACE` will not replace a row that conflicts with an `auto_increment` generated key.
- `mysqld` now only sets `CLIENT_TRANSACTIONS` in `mysql->server_capabilities` if the server supports a transaction-safe handler.
- Fixed `LOAD DATA INFILE` to allow numeric values to be read into `ENUM` and `SET` columns.
- Improved error diagnostic for slave thread exit.
- Fixed bug in `ALTER TABLE ... ORDER BY`.
- Added option `max_user_connections` to `mysqld`.
- Limit query length for replication by `max_allowed_packet`, not the arbitrary limit of 4 MB.
- Allow space around `=` in argument to `--set-variable`.
- Fixed problem in automatic repair that could leave some threads in state `Waiting for table`.
- `SHOW CREATE TABLE` now dumps the `UNION()` for `MERGE` tables.
- `ALTER TABLE` now remembers the old `UNION()` definition.
- Fixed bug when replicating timestamps.
- Fixed bug in bidirectional replication.
- Fixed bug in the `BDB` table handler that occurred when using an index on multi-part key where a key part may be `NULL`.
- Fixed `MAX()` optimization on sub-key for `BDB` tables.
- Fixed problem where garbage results were returned when using `BDB` tables and `BLOB` or `TEXT` fields when joining many tables.
- Fixed a problem with `BDB` tables and `TEXT` columns.
- Fixed bug when using a `BLOB` key where a const row wasn't found.
- Fixed that `mysqlbinlog` writes the timestamp value for each query. This ensures that one gets same values for date functions like `NOW()` when using `mysqlbinlog` to pipe the queries to another server.
- Allow one to use `--skip-gemini`, `--skip-bdb` and `--skip-innobase` to `mysqld` even if these databases are not compiled in `mysqld`.
- One can now do `GROUP BY ... DESC`.
- Fixed a deadlock in the `SET` code, when one ran `SET @foo=bar`, where `bar` is a column reference, an error was not properly generated.

### F.2.18 Changes in release 3.23.33

- Fixed that DNS lookups are not using the same mutex as the hostname cache. This will enable known hosts to be quickly resolved even if a DNS lookup takes a long time.
- Added `--character-sets-dir` to `myisampack`.
- Removed warnings when running `REPAIR TABLE ... EXTENDED`.
- Fixed a bug that caused a core dump when using `GROUP BY` on an alias, where the alias was the same as an existing column name.
- Added `SEQUENCE()` as an example UDF function.
- Changed `mysql_install_db` to use `BINARY` for `CHAR` columns in the privilege tables.
- Changed `TRUNCATE table_name` to `TRUNCATE TABLE table_name` to use the same syntax as Oracle. Until 4.0 we will also allow `TRUNCATE table_name` to not crash old code.
- Fixed 'no found rows' bug in `MyISAM` tables when a `BLOB` was first part of a multi-part key.
- Fixed bug where `CASE` didn't work with `GROUP BY`.
- Added option `--sort-recover` to `myisamchk`.
- `myisamchk -S` and `OPTIMIZE TABLE` now work on Windows.
- Fixed bug when using `DISTINCT` on results from functions that referred to a group function, like:

      SELECT a, DISTINCT SEC_TO_TIME(sum(a)) from table_name GROUP BY a, b;

- Fixed buffer overrun in `libmysqlclient` library. Fixed bug in handling `STOP` event after `ROTATE` event in replication.
- Fixed another buffer overrun in `DROP DATABASE`.
- Added `Table_locks_immediate` and `Table_locks_waited` status variables.
- Fixed bug in replication that broke slave server start with existing `master.info`. This fixes a bug introduced in 3.23.32.
- Added `SET SQL_SLAVE_SKIP_COUNTER=n` command to recover from replication glitches without a full database copy.
- Added `max_binlog_size` variable; the binary log will be rotated automatically when the size crosses the limit.
- Added `Last_error`, `Last_errno`, and `Slave_skip_counter` to `SHOW SLAVE STATUS`.
- Fixed bug in `MASTER_POS_WAIT()` function.
- Execute coredump handler on `SIGILL`, and `SIGBUS` in addition to `SIGSEGV`.
- On x86 Linux, print the current query and thread (connection) id, if available, in the coredump handler.
- Fixed several timing bugs in the test suite.
- Extended `mysqltest` to take care of the timing issues in the test suite.
- `ALTER TABLE` can now be used to change the definition for a `MERGE` table.
- Fixed creation of `MERGE` tables on Windows.
- Portability fixes for OpenBSD and OS2.
- Added `--temp-pool` option to `mysqld`. Using this option will cause most temporary files created to use a small set of names, rather than a unique name for each new file. This is to work around a problem in the Linux kernel dealing with creating a bunch of new files with different names. With the old behavior, Linux seems to "leak" memory, as it's being allocated to the directory entry cache instead of the disk cache.

### F.2.19 Changes in release 3.23.32

- Changed code to get around compiler bug in Compaq C++ on OSF1, that broke `BACKUP`, `RESTORE`, `CHECK`, `REPAIR`, and `ANALYZE TABLE`.
- Added option `FULL` to `SHOW COLUMNS`. Now we show the privilege list for the columns only if this option is given.
- Fixed bug in `SHOW LOGS` when there weren't any BDB logs.
- Fixed a timing problem in replication that could delay sending an update to the client until a new update was done.
- Don't convert field names when using `mysql_list_fields()`. This is to keep this code compatible with `SHOW FIELDS`.
- `MERGE` tables didn't work on Windows.
- Fixed problem with `SET PASSWORD=...` on Windows.
- Added missing ``my_config.h'` to RPM distribution.
- `TRIM("foo" from "foo")` didn't return an empty string.
- Added `--with-version-suffix` to `configure`.
- Fixed coredump when client aborted connection without `mysql_close()`.
- Fixed a bug in `RESTORE TABLE` when trying to restore from a non-existent directory.
- Fixed a bug which caused a core dump on the slave when replicating `SET PASSWORD`.
- Added `MASTER_POS_WAIT()`.

### F.2.20 Changes in release 3.23.31

- The test suite now tests all reachable BDB interface code. During testing we found and fixed many errors in the interface code.
- Using `HAVING` on an empty table could produce one result row when it shouldn't.
- Fixed that the MySQL RPM is not dependent on Perl5 anymore.
- Fixed some problems with `HEAP` tables on Windows.
- `SHOW TABLE STATUS` didn't show correct average row length for tables larger than 4G.
- `CHECK TABLE ... EXTENDED` didn't check row links for fixed size tables.
- Added option `MEDIUM` to `CHECK TABLE`.
- Fixed problem when using `DECIMAL()` keys on negative numbers.
- `HOUR()` (and some other `TIME` functions) on a `CHAR` column always returned `NULL`.
- Fixed security bug in something (please upgrade if you are using a earlier MySQL 3.23 version).
- Fixed buffer overflow bug when writing a certain error message.
- Added usage of `setrlimit()` on Linux to get `-O --open-files-limit=#` to work on Linux.
- Added new `mysqld` variable: `bdb_version`.
- Fixed bug when using expression of type:

      SELECT ... FROM t1 LEFT JOIN t2 ON (t1.a=t2.a) WHERE t1.a=t2.a

  In this case the test in the `WHERE` clause was wrongly optimized away.
- Fixed bug in `MyISAM` when deleting keys with possible `NULL` values, but the first key-column was not a prefix-compressed text column.
- Fixed `mysql.server` to read the `mysql.server` option section instead of `mysql_server`.
- Fixed `safe_mysqld` and `mysql.server` to also read the `server` option section.
- Added `Threads_created` status variable to `mysqld`.

### F.2.21 Changes in release 3.23.30

- Added `SHOW OPEN TABLES` command.
- Fixed that `myisamdump` works against old `mysqld` servers.
- Fixed `myisamchk -k#` so that it works again.
- Fixed a problem with replication when the binary log file went over 2G on 32-bit systems.
- `LOCK TABLES` will now automatically start a new transaction.
- Changed `BDB` tables to not use internal subtransactions and reuse open files to get more speed.
- Added option `--mysqld=#` to `safe_mysqld`.
- Allow hex constants in the `--fields-*-by` and `--lines-terminated-by` options to `mysqldump` and `mysqlimport`. By Paul DuBois.
- Added option `--safe-show-database` to `mysqld`.
- Added `have_bdb`, `have_gemini`, `have_innobase`, `have_raid` and `have_ssl` to `SHOW VARIABLES` to make it easy to test for supported extensions.
- Added option `--open-files-limit` to `mysqld`.
- Changed option `--open-files` to `--open-files-limit` in `safe_mysqld`.
- Fixed a bug where some rows were not found with `HEAP` tables that had many keys.
- Fixed that `--bdb-no-sync` works.
- Changed `--bdb-recover` to `--bdb-no-recover` as recover should be on by default.
- Changed the default number of BDB locks to 10000.
- Fixed a bug from 3.23.29 when allocating the shared structure needed for BDB tables.
- Changed ``mysqld_multi.sh'` to use configure variables. Patch by Christopher McCrory.
- Added fixing of include files for Solaris 2.8.
- Fixed bug with `--skip-networking` on Debian Linux.
- Fixed problem that some temporary files where reported as having the name `UNOPENED` in error messages.
- Fixed bug when running two simultaneous `SHOW LOGS` queries.

### F.2.22 Changes in release 3.23.29

- Configure updates for Tru64, large file support, and better TCP wrapper support. By Albert Chin-A-Young.
- Fixed bug in `<=>` operator.
- Fixed bug in `REPLACE` with BDB tables.
- `LPAD()` and `RPAD()` will shorten the result string if it's longer than the length argument.
- Added `SHOW LOGS` command.
- Remove not used BDB logs on shutdown.
- When creating a table, put `PRIMARY` keys first, followed by `UNIQUE` keys.
- Fixed a bug in `UPDATE` involving multi-part keys where one specified all key parts both in the update and the `WHERE` part. In this case MySQL could try to update a record that didn't match the whole `WHERE` part.
- Changed drop table to first drop the tables and then the ``.frm'` file.
- Fixed a bug in the hostname cache which caused `mysqld` to report the hostname as `''` in some error messages.
- Fixed a bug with `HEAP` type tables; the variable `max_heap_table_size` wasn't used. Now either `MAX_ROWS` or `max_heap_table_size` can be used to limit the size of a `HEAP` type table.
- Changed the default server-id to 1 for masters and 2 for slaves to make it easier to use the binary log.
- Renamed variable `bdb_lock_max` to `bdb_max_lock`.
- Added support for `auto_increment` on sub-fields for BDB tables.
- Added `ANALYZE` of BDB tables.
- In BDB tables, we now store the number of rows; This helps to optimize queries when we need an approximation of the number of rows.
- If we get an error in a multi-row statement, we now only rollback the last statement, not the entire transaction.
- If you do a `ROLLBACK` when you have updated a non-transactional table you will get an error as a warning.
- Added option `--bdb-shared-data` to `mysqld`.
- Added status variable `Slave_open_temp_tables`.
- Added variables `binlog_cache_size` and `max_binlog_cache_size` to `mysqld`.
- `DROP TABLE`, `RENAME TABLE`, `CREATE INDEX` and `DROP INDEX` are now transaction endpoints.
- If you do a `DROP DATABASE` on a symbolic linked database, both the link and the original database is deleted.
- Fixed that `DROP DATABASE` works on OS/2.
- Fixed bug when doing a `SELECT DISTINCT ... table1 LEFT JOIN table2 ...` when table2 was empty.
- Added `--abort-slave-event-count` and `--disconnect-slave-event-count` options to `mysqld` for debugging and testing of replication.
- Fixed replication of temporary tables. Handles everything except slave server restart.
- `SHOW KEYS` now shows whether or not key is `FULLTEXT`.
- New script ``mysqld_multi'`. 「4.7.3 mysqld_multi, program for managing multiple MySQL servers」節参照.
- Added new script, ``mysql-multi.server.sh'`. Thanks to Tim Bunce Tim.Bunce@ig.co.uk for modifying ``mysql.server'` to easily handle hosts running many `mysqld` processes.
- ``safe_mysqld'`, ``mysql.server'`, and ``mysql_install_db'` have been modified to use `mysql_print_defaults` instead of various hacks to read the ``my.cnf'` files. In addition, the handling of various paths has been made more consistent with how `mysqld` handles them by default.
- Automatically remove Berkeley DB transaction logs that no longer are in use.
- Fixed bug with several `FULLTEXT` indexes in one table.
- Added a warning if number of rows changes on `REPAIR`/`OPTIMIZE`.
- Applied patches for OS/2 by `Yuri Dario`.
- `FLUSH TABLES table_name` didn't always flush the index tree to disk properly.
- `--bootstrap` is now run in a separate thread. This fixes a problem that caused `mysql_install_db` to core dump on some Linux machines.
- Changed `mi_create()` to use less stack space.
- Fixed bug with optimizer trying to over-optimize `MATCH` when used with `UNIQUE` key.
- Changed `crash-me` and the MySQL benchmarks to also work with FrontBase.
- Allow `RESTRICT` and `CASCADE` after `DROP TABLE` to make porting easier.
- Reset status variable which could cause problem if one used `--slow-log`.
- Added variable `connect_timeout` to `mysql` and `mysqladmin`.
- Added `connect_timeout` as an alias for `timeout` for option files read by `mysql_options()`.

### F.2.23 Changes in release 3.23.28

- Added new options `--pager[=...]`, `--no-pager`, `--tee=...` and `--no-tee` to the `mysql` client. The new corresponding interactive commands are `pager`, `nopager`, `tee` and `notee`. 「4.8.2 コマンドラインツール　（ `mysql` ）」節参照, `mysql --help` and the interactive help for more information.
- Fixed crash when automatic repair of `MyISAM` table failed.
- Fixed a major performance bug in the table locking code when one constantly had a LOT of `SELECT`, `UPDATE` and `INSERT` statements running. The symptom was that the `UPDATE` and `INSERT` queries were locked for a long time while new `SELECT` statements were executed before the updates.
- When reading `options_files` with `mysql_options()` the `return-found-rows` option was ignored.
- One can now specify `interactive-timeout` in the option file that is read by `mysql_options()`. This makes it possible to force programs that run for a long time (like `mysqlhotcopy`) to use `interactive_timeout` instead of `wait_timeout`.
- Added to the slow query log the time and the user name for each logged query. If you are using `--log-long-format` then also queries that do not use an index are logged, even if the query takes less than `long_query_time` seconds.
- Fixed a problem in `LEFT JOIN` which caused all columns in a reference table to be `NULL`.
- Fixed a problem when using `NATURAL JOIN` without keys.
- Fixed a bug when using a multi-part keys where the first part was of type `TEXT` or `BLOB`.
- `DROP` of temporary tables wasn't stored in the update/binary log.
- Fixed a bug where `SELECT DISTINCT * ... LIMIT #` only returned one row.
- Fixed a bug in the assembler code in `strstr()` for sparc and cleaned up the ``global.h'` header file to avoid a problem with bad aliasing with the compiler submitted with RedHat 7.0. (Reported by Trond Eivind Glomsrd)
- The option `--skip-networking` now works properly on NT.
- Fixed a long outstanding bug in the `ISAM` tables when a row with a length of more than 65K was shortened by a single byte.
- Fixed a bug in `MyISAM` when running multiple updating processes on the same table.
- Allow one to use `FLUSH TABLE tablename`.
- Added `--replicate-ignore-table`, `--replicate-do-table`, `--replicate-wild-ignore-table`, `--replicate-wild-do-table`.
- Changed all log files to use our own `IO_CACHE` mechanism instead of `FILE` to avoid OS problems when there are many files open.
- Added options `--open-files` and `--timezone` to `safe_mysqld`.
- Fixed a fatal bug in `CREATE TEMPORARY TABLE ... SELECT ...`.
- Fixed a problem with `CREATE TABLE ... SELECT NULL`.
- Added variables `large_file_support`,`net_read_timeout`, `net_write_timeout` and `query_buffer_size` to `SHOW VARIABLES`.
- Added status variables `created_tmp_files` and `sort_merge_passes` to `SHOW STATUS`.
- Fixed a bug where we didn't allow an index name after the `FOREIGN KEY` definition.
- Added `TRUNCATE table_name` as a synonym for `DELETE FROM table_name`.
- Fixed a bug in a BDB key compare function when comparing part keys.
- Added variable `bdb_lock_max` to `mysqld`.
- Added more tests to the benchmark suite.
- Fixed an overflow bug in the client code when using overly long database names.
- `mysql_connect()` now aborts on Linux if the server doesn't answer in `timeout` seconds.
- `SLAVE START` did not work if you started with `--skip-slave-start` and had not explicitly run `CHANGE MASTER TO`.
- Fixed the output of `SHOW MASTER STATUS` to be consistent with `SHOW SLAVE STATUS`. (It now has no directory in the log name.)
- Added `PURGE MASTER LOGS TO`.
- Added `SHOW MASTER LOGS`.
- Added `--safemalloc-mem-limit` option to `mysqld` to simulate memory shortage when compiled `--with-debug=full`.
- Fixed several coredumps in out-of-memory conditions.
- `SHOW SLAVE STATUS` was using an uninitialized mutex if the slave had not been started yet.
- Fixed bug in `ELT()` and `MAKE_SET()` when the query used a temporary table.
- `CHANGE MASTER TO` without specifying `MASTER_LOG_POS` would set it to 0 instead of 4 and hit the magic number in the master binlog.
- `ALTER TABLE ... ORDER BY ...` syntax added. This will create the new table with the rows in a specific order.

### F.2.24 Changes in release 3.23.27

- Fixed a bug where the automatic repair of MyISAM tables sometimes failed when the data file was corrupt.
- Fixed a bug in `SHOW CREATE` when using `AUTO_INCREMENT` columns.
- Changed BDB tables to use new compare function in Berkeley DB 3.2.3.
- You can now use Unix sockets with `mit-pthreads`.
- Added the latin5 (turkish) character set.
- Small portability fixes.

### F.2.25 Changes in release 3.23.26

- Fixed `<>` to work properly with `NULL`.
- Fixed a problem with `SUBSTRING_INDEX()` and `REPLACE()`. (Patch by Alexander Igonitchev)
- Fix `CREATE TEMPORARY TABLE IF NOT EXISTS` not to give an error if the table exists.
- If you don't create a `PRIMARY KEY` in a BDB table, a hidden `PRIMARY KEY` will be created.
- Added read-only-key optimization to BDB tables.
- `LEFT JOIN` in some cases preferred a full table scan when there was no `WHERE` clause.
- When using `--log-slow-queries`, don't count the time waiting for a lock.
- Fixed bug in lock code on Windows which could cause the key cache to report that the key file was crashed even if it was okay.
- Automatic repair of `MyISAM` tables if you start `mysqld` with `--myisam-recover`.
- Removed the `TYPE=` keyword from `CHECK` and `REPAIR`. Allow `CHECK` options to be combined. (You can still use `TYPE=` but this usage is deprecated.)
- Fixed mutex bug in the binary replication log - long update queries could be read only in part by the slave if it did it at the wrong time, which was not fatal, but resulted in a performance-degrading reconnect and a scary message in the error log.
- Changed the format of the binary log - added magic number, server version, binlog version. Added server id and query error code for each query event.
- Replication thread from the slave now will kill all the stale threads from the same server.
- Long replication user names were not being handled properly.
- Added `--replicate-rewrite-db` option to `mysqld`.
- Added `--skip-slave-start` option to `mysqld`.
- Updates that generated an error code (such as `INSERT INTO foo(some_key) values (1),(1)`) erroneously terminated the slave thread.
- Added optimization of queries where `DISTINCT` is only used on columns from some of the tables.
- Allow floating-point numbers where there is no sign after the exponent (like 1e1).
- `SHOW GRANTS` didn't always show all column grants.
- Added `--default-extra-file=#` to all MySQL clients.
- Columns referenced in `INSERT` statements now are initialized properly.
- `UPDATE` didn't always work when used with a range on a timestamp that was part of the key that was used to find rows.
- Fixed a bug in `FULLTEXT` index when inserting a `NULL` column.
- Changed to use `mkstemp()` instead of `tempnam()`. Based on a patch from John Jones.

### F.2.26 Changes in release 3.23.25

- Fixed that `databasename` works as second argument to `mysqlhotcopy`.
- `UMASK` and `UMASK_DIR` can now be specified in octal.
- Added `RIGHT JOIN`. This makes `RIGHT` a reserved word.
- Added `@@IDENTITY` as a synonym for `LAST_INSERT_ID()`. (This is for Visual Basic compatibility.)
- Fixed a bug in `myisamchk` and `REPAIR` when using `FULLTEXT` index.
- `LOAD DATA INFILE` now works with FIFOs. (Patch by Toni L. Harbaugh-Blackford.)
- `FLUSH LOGS` broke replication if you specified a log name with an explicit extension as the value of the `log-bin` option.
- Fixed a bug in `MyISAM` with packed multi-part keys.
- Fixed crash when using `CHECK TABLE` on Windows.
- Fixed a bug where `FULLTEXT` index always used the koi8_ukr character set.
- Fixed privilege checking for `CHECK TABLE`.
- The `MyISAM` repair/reindex code didn't use the `--tempdir` option for its temporary files.
- Added `BACKUP TABLE/RESTORE TABLE`.
- Fixed coredump on `CHANGE MASTER TO` when the slave did not have the master to start with.
- Fixed incorrect `Time` in the processlist for `Connect` of the slave thread.
- The slave now logs when it connects to the master.
- Fixed a core dump bug when doing `FLUSH MASTER` if you didn't specify a filename argument to `--log-bin`.
- Added missing ``ha_berkeley.x'` files to the MySQL Windows
- Fixed some mutex bugs in the log code that could cause thread blocks if new log files couldn't be created.
- Added lock time and number of selected processed rows to slow query log.
- Added `--memlock` option to `mysqld` to lock `mysqld` in memory on systems with the `mlockall()` call (like in Solaris).
- `HEAP` tables didn't use keys properly. (Bug from 3.23.23.)
- Added better support for `MERGE` tables (keys, mapping, creation, documentation...). 「7.2 MERGE Tables」節参照.
- Fixed bug in `mysqldump` from 3.23 which caused some `CHAR` columns not to be quoted.
- Merged `analyze`, `check`, `optimize` and repair code.
- `OPTIMIZE TABLE` is now mapped to `REPAIR` with statistics and sorting of the index tree. This means that for the moment it only works on `MyISAM` tables.
- Added a pre-alloced block to root_malloc to get fewer mallocs.
- Added a lot of new statistics variables.
- Fixed `ORDER BY` bug with BDB tables.
- Removed warning that `mysqld` couldn't remove the ``.pid'` file under Windows.
- Changed `--log-isam` to log MyISAM tables instead of isam tables.
- Fixed `CHECK TABLE` to work on Windows.
- Added file mutexes to make `pwrite()` safe on Windows.

### F.2.27 Changes in release 3.23.24

- Added `mysqld` variable `created_tmp_disk_tables`.
- To make it possible to reliably dump and restore tables with `TIMESTAMP(X)` columns, MySQL now reports columns with `X` other than 14 or 8 to be strings.
- Changed sort order for latin1 as it was before MySQL Version 3.23.23. Any table with `CHAR` columns that may have characters with ASCII values greater than 128 that was created or modified with 3.23.22 must be repaired!
- Fixed small memory leak introduced from 3.23.22 when creating a temporary table.
- Fixed problem with BDB tables and reading on a unique (not primary) key.
- Restored the win1251 character set (it's now only marked deprecated).

### F.2.28 Changes in release 3.23.23

- Changed sort order for 'German'; All tables created with 'German' sortorder must be repaired with `REPAIR TABLE` or `myisamchk` before use!
- Added option `--core-file` to `mysqld` to get a core file on Linux if `mysqld` dies on the SIGSEGV signal.
- MySQL クライアントの `mysql` は、デフォルトで `--no-named-commands` (`-g`) オプションで起動されるようになった。 このオプションは `--enable-named-commands` (`-G`) で無効にできる。 これはある場合に非互換の問題を引き起こすでしょう。たとえば、セミコロンなしで named コマンドを使用している SQL スクリプトなど！ Long format commands still work from the first line.
- Fixed a problem when using many pending `DROP TABLE` statements at the same time.
- Optimizer didn't use keys properly when using `LEFT JOIN` on an empty table.
- Added shorter help text when invoking `mysqld` with incorrect options.
- Fixed non-fatal `free()` bug in `mysqlimport`.
- Fixed bug in `MyISAM` index handling of `DECIMAL`/`NUMERIC` keys.
- Fixed a bug in concurrent insert in `MyISAM` tables; In some contexts, usage of `MIN(key_part)` or `MAX(key_part)` returned an empty set.
- Updated `mysqlhotcopy` to use the new `FLUSH TABLES table_list` syntax. Only tables which are being backed up are flushed now.
- `--enable-thread-safe-client` の振る舞いを変更。 非スレッド (`-lmysqlclient`) とスレッド (`-lmysqlclient_r`) ライブラリ の両方が作成されるため。 今までスレッド化された `-lmysqlclient` をリンクしていた場合には、 今後、`libmysqlclient_r` のリンクが必要となる。
- Added atomic `RENAME` command.
- `COUNT(DISTINCT ...)` は `NULL` のエントリを数えない。
- Changed `ALTER TABLE`, `LOAD DATA INFILE` on empty tables and `INSERT ... SELECT ...` on empty tables to create non-unique indexes in a separate batch with sorting. This will make the above calls much faster when you have many indexes.
- `ALTER TABLE` now logs the first used insert_id correctly.
- `BLOB` フィールドにデフォルト値を定義した場合にクラッシュしていたのを修正。
- `DATE_ADD/DATE_SUB` が date でなく datetime を返していたバグを修正。
- Fixed a problem with the thread cache which made some threads show up as `***DEAD***` in `SHOW PROCESSLIST`.
- Fixed a lock in our thr_rwlock code, which could make selects that run at the same time as concurrent inserts crash. This only affects systems that don't have the `pthread_rwlock_rdlock` code.
- When deleting rows with a non-unique key in a HEAP table, all rows weren't always deleted.
- Fixed bug in range optimizer for HEAP tables for searches on a part index.
- Fixed that `SELECT` on part keys works with BDB tables.
- Fixed `INSERT INTO bdb_table ... SELECT` to work with BDB tables.
- `CHECK TABLE` はそのテーブルのキーの統計情報も更新するようになった。
- `ANALYZE TABLE` will now only update tables that have been changed since thee last `ANALYZE`. Note that this is a new feature and tables will not be marked to be analyzed until they are updated in any way with 3.23.23 or newer. For older tables, you have to do `CHECK TABLE` to update the key distribution.
- Fixed some minor privilege problems with `CHECK`, `ANALYZE`, `REPAIR` and `SHOW CREATE` commands.
- `CHANGE MASTER TO` コマンドの追加。
- Added `FAST`, `QUICK` `EXTENDED` check types to `CHECK TABLES`.
- Changed `myisamchk` so that `--fast` and `--check-changed-tables` are also honored with `--sort-index` and `--analyze`.
- `LOAD TABLE FROM MASTER` がインデックスを再構築している間にテーブルを ロックしなかったバグを修正。
- もしデータベースがレプリケーション対象外の場合に `LOAD DATA INFILE` を 行うと、レプリケーションを壊していたのを修正。
- More variables in `SHOW SLAVE STATUS` and `SHOW MASTER STATUS`.
- `SLAVE STOP` now will not return until the slave thread actually exits.
- `MATCH` 関数を利用した全テキスト検索と `FULLTEXT` インデックスの追加。 (MyISAM でのみ利用可能)。 これにより `FULLTEXT` が予約語になる。

### F.2.29 Changes in release 3.23.22

- Fixed that `lex_hash.h` is created properly for each MySQL distribution.
- Fixed that `MASTER` and `COLLECTION` are not reserved words.
- The log generated by `--slow-query-log` didn't contain the whole queries.
- Fixed that open transactions in BDB tables are rolled back if the connection is closed unexpectedly.
- Added workaround for a bug in `gcc` 2.96 (intel) and `gcc` 2.9 (Ia64) in `gen_lex_hash.c`.
- `my.cnf` ファイルで `host=` を使用した場合、 クライアントライブラリにメモリリークがあったのを修正した。
- Optimized functions that manipulate the hours/minutes/seconds.
- Fixed bug when comparing the result of `DATE_ADD()`/`DATE_SUB()` against a number.
- Changed the meaning of `-F, --fast` for `myisamchk`. Added option `-C, --check-only-changed` to `myisamchk`.
- Added `ANALYZE table_name` to update key statistics for tables.
- Changed binary items `0x...` to be regarded as integers by default.
- Fix for SCO and `SHOW PROCESSLIST`.
- Added `auto-rehash` on reconnect for the `mysql` client.
- `MyISAM` の インデックスファイルが 64M bytes を超えれないバグを修正した。 3.23.21 でエンバグした。
- `SHOW MASTER STATUS` と `SHOW SLAVE STATUS` の追加。

### F.2.30 Changes in release 3.23.21

- MySQL C API に `mysql_character_set_name(MYSQL *mysql)` 関数を追加。
- Made the update log `ASCII 0` safe.
- `mysql_config` スクリプトの追加。
- Fixed problem when using `<` or `>` with a char column that was only partly indexed.
- One would get a core dump if the log file was not readable by the MySQL user.
- `mysqladmin` を、API コールしていたかわりに、 `CREATE DATABASE`/`DROP DATABASE` コマンドを 使用するように変更した。
- Fixed `chown` warning in `safe_mysqld`.
- `ORDER BY` のバグを修正。 3.23.19 でエンバグした。
- Only optimize the `DELETE FROM tbl_name` to do a drop+create of the table if we are in `AUTOCOMMIT` mode. (Needed for BDB tables).
- Added extra checks to avoid index corruption when the `ISAM`/`MyISAM` index files gets full during an `INSERT`/`UPDATE`.
- `myisamchk` didn't correctly update row checksum when used with `-ro` (This only gave an warning in subsequent runs).
- Fixed bug in `REPAIR TABLE` so that it works with tables without indexes.
- Fixed buffer overrun in `DROP DATABASE`
- `LOAD TABLE FROM MASTER` is sufficiently bug-free to announce it as a feature.
- `MATCH` と `AGAINST` が予約語になった。

### F.2.31 Changes in release 3.23.20

- 3.23.19 のバグを修正した; `DELETE FROM table_name` が .frm ファイルを消してしまっていた。
- Added `SHOW CREATE TABLE`.

### F.2.32 Changes in release 3.23.19

- 全てのファイルのコピライトの変更。 サーバーとユーティリティのコードは GPL に, クライアントライブラリは LGPL に。
- Fixed bug where all rows matching weren't updated on a `MyISAM` table when doing update based on key on a table with many keys and some key changed values.
- The Linux MySQL RPM's and binaries are now statically linked with a linuxthread version that has faster mutex handling when used with MySQL.
- `ORDER BY` can now uses `REF` keys to find subset the rows that needs to be sorted.
- `print_defaults` の名前を `my_print_defaults` に変更。 名前の衝突をさけるため。
- Fixed `NULLIF()` to work according to ANSI SQL99.
- `net_read_timeout` と `net_write_timeout` を `mysqld` の起動時のパラメタとして追加。
- Fixed bug that destroyed index when doing `myisamchk --sort-records` on a table with prefix compressed index.
- pack_isam と myisampack を MySQL の標準配布に追加。
- Added the syntax `BEGIN WORK` (the same as `BEGIN`).
- Fixed core dump bug when using `ORDER BY` on a `CONV()` expression.
- Added `LOAD TABLE FROM MASTER`
- Added `FLUSH MASTER` and `FLUSH SLAVE`
- Fixed big/little endian problem in the replication

### F.2.33 Changes in release 3.23.18

- Fixed a problem from 3.23.17 when choosing character set on the client side.
- Added `FLUSH TABLES WITH READ LOCK` to make a global lock suitable to make a copy of MySQL data files.
- `CREATE TABLE ... SELECT ... PROCEDURE` now works.
- Internal temporary tables will now uses compressed index when using `GROUP BY` on `VARCHAR/CHAR` columns.
- Fixed a problem when locking the same table with both a `READ` and a `WRITE` lock.
- Fixed problem with myisamchk and `RAID` tables.

### F.2.34 Changes in release 3.23.17

- Fixed a bug in `find_in_set()` when the first argument was `NULL`.
- Added table locks to Berkeley DB.
- Fixed a bug with `LEFT JOIN` and `ORDER BY` where the first table had only one matching row.
- Added 4 sample `my.cnf` example files in the ``support-files'` directory.
- Fixed `duplicated key` problem when doing big `GROUP BY`'s. (This bug was probably introduced in 3.23.15).
- `INNER JOIN` の文法を ANSI SQL にマッチさせた.
- `NATURAL JOIN` 構文を追加.
- A lot of fixes in the `BDB` interface.
- Added handling of `--no-defaults` and `--defaults-file` to `safe_mysqld.sh` and `mysql_install_db.sh`.
- Fixed bug in reading compressed tables with many threads.
- Fixed that `USE INDEX` works with `PRIMARY` keys.
- Added `BEGIN` statement to start a transaction in `AUTOCOMMIT` mode.
- シンボリックリンクを Windows 上でサポート.
- Changed protocol to let client know if the server is in AUTOCOMMIT mode and if there is a pending transaction. If there is a pending transaction the client library will give an error before reconnecting to the server to let the client know that the server did a rollback. The protocol is still backward compatible with old clients
- `KILL` now works on a thread that is locked on a 'write' to a dead client.
- Fixed memory leak in the replication slave thread.
- Added new option `log-slave-updates` to allow daisy-chaining the slaves.
- Fixed compile error on FreeBSD and other systems where `pthread_t` is not the same as `int`.
- Fixed master shutdown aborting the slave thread.
- Fixed a race condition in `INSERT DELAYED` code when doing `ALTER TABLE`.
- Added deadlock detection sanity checks to `INSERT DELAYED`

### F.2.35 Changes in release 3.23.16

- `TYPE=QUICK` オプションを `CHECK` と `REPAIR` に追加。
- Fixed bug in `REPAIR TABLE` when the table was in use by other threads.
- Added a thread cache to make it possible to debug MySQL with `gdb` when one does a lot of reconnects. This will also improve systems where you can't use persistent connections.
- Berkeley DB インターフェースの多くを修正。
- `UPDATE IGNORE` will not abort if an update results in a `DUPLICATE_KEY` error.
- Put `CREATE TEMPORARY TABLE` commands in the update log.
- Fixed bug in handling of masked IP numbers in the privilege tables.
- Fixed bug with `delayed_key_writes` tables and `CHECK TABLE`.
- Added `replicate-do-db` and `replicate-ignore-db` options to restrict which databases get replicated
- `SQL_LOG_BIN` オプションを追加。

### F.2.36 Changes in release 3.23.15

- To start `mysqld` as `root` one must now use the `--user=root` option.
- Added interface to Berkeley DB. (This is not yet functional; Play with it at your own risk!)
- マスターとスレーブ間での複製機能を追加。
- Fixed bug that other threads could steal a lock when a thread had a lock on a table and did a `FLUSH TABLES` command.
- Added the `slow_launch_time` variable and the `Slow_launch_threads` status variable to `mysqld`. These can be examined with `mysqladmin variables` and `mysqladmin extended-status`.
- Added functions `INET_NTOA()` and `INET_ATON()`.
- The default type of `IF()` now depends on the second and third arguments and not only on the second argument.
- Fixed case when `myisamchk` could go into a loop when trying to repair a crashed table.
- Don't write `INSERT DELAYED` to update log if `SQL_LOG_UPDATE=0`.
- Fixed problem with `REPLACE` on `HEAP` tables.
- Added possible character sets and time zone to `SHOW VARIABLES`.
- Fixed bug in locking code that could result it locking problems with concurrent inserts under high load.
- Fixed a problem with `DELETE` of many rows on a table with compressed keys where MySQL scanned the index to find the rows.
- Fixed problem with `CHECK` on table with deleted keyblocks.
- Fixed a bug in reconnect (at the client side) where it didn't free memory properly in some contexts.
- Fixed problems in update log when using `LAST_INSERT_ID()` to update a table with an auto_increment key.
- Added function `NULLIF()`.
- Fixed bug when using `LOAD DATA INFILE` on a table with `BLOB/TEXT` columns.
- Optimised MyISAM to be faster when inserting keys in sorted order.
- `EXPLAIN SELECT ...` now also prints out whether MySQL needs to create a temporary table or use file sorting when resolving the `SELECT`.
- Added optimization to skip `ORDER BY` parts where the part is a constant expression in the `WHERE` part. Indexes can now be used even if the `ORDER BY` doesn't match the index exactly, as long as all the not used index parts and all the extra `ORDER BY` columns are constants in the `WHERE` clause. 「5.4.3 MySQL はどのようにインデックスを使用するか？」節参照.
- `UPDATE` and `DELETE` on a whole unique key in the `WHERE` part, is now faster than before.
- Changed `RAID_CHUNKSIZE` to be in 1024 byte increments.
- Fixed coredump in LOAD_FILE(NULL).

### F.2.37 Changes in release 3.23.14

- Fixed a bug in `CONCAT()` where one of the arguments was a function that returned a modified argument.
- `myisamchk` の致命的なバグを修正した。 このバグはインデックスファイル中の ヘッダーを、テーブルをチェックしているだけなのにもかかわらず、更新していた。 This confused the `mysqld` daemon if it updated the same table at the same time. Now the status in the index file is only updated if one uses `--update-state`. With older `myisamchk` versions you shoul use `--read-only` when only checking tables, if there is the slightest chance that the `mysqld` server is working on the table at the same time!
- Fixed that `DROP TABLE` is logged in the update log.
- Fixed problem when searching on `DECIMAL()` key field where the column data contained leading zeros.
- auto_increment が最初のキーでない場合の `myisamchk` のバグを修正。
- Allow `DATETIME` in ISO8601 format: 2000-03-12T12:00:00
- 動的キャラクタセット。 １個の `mysqld` バイナリで、多くの違う キャラクタセットを扱えるようになった。 (`mysqld` スタート時に指定できます).
- `REPAIR TABLE` コマンドを追加。
- `mysql_thread_safe()` C API 関数を追加。
- `UMASK_DIR` 環境変数を追加。
- `CONNECTION_ID()` 関数を追加
- When using `=` on `BLOB` or `VARCHAR BINARY` keys, where only a part of the column was indexed, the whole column of the result row wasn't compared.
- sjis キャラクターセットの `ORDER BY` の問題を修正
- When running in ANSI mode, don't allow columns to be used that aren't in the `GROUP BY` part.

### F.2.38 Changes in release 3.23.13

- Fixed problem when doing locks on the same table more than 2 times in the same `LOCK TABLE` command; This fixed the problem one got when running the test-ATIS test with `--fast` or `--check-only-changed`.
- `SQL_BUFFER_RESULT` オプションを `SELECT` に追加
- Removed end space from double/float numbers in results from temporary tables. `CHECK TABLE` コマンドの追加。
- Added changes for MyISAM in 3.23.12 that didn't get into the source distribution because of CVS problems.
- Fixed bug so that `mysqladmin shutdown` will wait for the local server to close down.
- Fixed a possible endless loop when calculating timestamp.
- Added `print_defaults` to the ``.rpm'` files. Removed `mysqlbug` from the client ``.rpm'` file.

### F.2.39 Changes in release 3.23.12

- Fixed bug in `MyISAM` involving `REPLACE ... SELECT ...` which could give a corrupted table.
- Fixed bug in `myisamchk` where it wrongly reset the auto_increment value.
- Linux Alpha 用に多くのパッチを追加. MySQL now appears to be relatively stable on Alpha.
- 重複したレコードを速く見つけるためのハッシュ化されたキーを使用するために、 `HEAP` 一時テーブル上の `DISTINCT` を変更した。 This mostly concerns queries of type `SELECT DISTINCT ... GROUP BY ...`. This fixes a problem where not all duplicates were removed in queries of the above type. 新しく追加したコードは、とても速い。
- MacOS X で MySQL をコンパイルできるようになるパッチの追加
- オプション `IF NOT EXISTS` を `CREATE DATABASE` に追加.
- 多くのデータベースを同時にダンプできるように、 `--all-databases` と `--databases` オプションを `mysqldump` に追加。
- `MyISAM` 型テーブル中の圧縮した `DECIMAL()` インデックスのバグを修正した。
- 0 を timestamp に保存したときのバグを修正した。
- ローカルの接続で `mysqladmin shutdown` を実行した場合に、`mysqladmin` は 終了前に pidfile が無くなるまで待つようになった。
- いくつかの `COUNT(DISTINCT ...)` クエリでコアを吐いたのを修正した。
- Fixed that `myisamchk` works properly with RAID:ed tables.
- Fixed problem with `LEFT JOIN` and `key_field IS NULL`.
- Fixed bug in `net_clear()` which could give the error `Aborted connection` in the MySQL clients.
- Added options `USE INDEX (key_list)` and `IGNORE INDEX (key_list)` as join parameters in `SELECT`.
- `DELETE` and `RENAME` should now work on `RAID` tables.

### F.2.40 Changes in release 3.23.11

- `ALTER TABLEL tbl_name ADD (field_list)` 文を許可した。
- Fixed problem with optimizer that could sometimes use wrong keys.
- `GRANT/REVOKE ALL PRIVILEGES` が `GRANT OPTION` に影響しなかったのを修正。
- Removed extra `)` from the output of `SHOW GRANTS`
- Fixed problem when storing numbers in timestamps.
- Fix problem with timezones that have half hour offsets.
- `CREATE` 文での `UNIQUE INDEX` の使用を許可。
- `mysqlhotcopy` - ローカルの MySQL データベースをバックアップする ツール。 By Tim Bunce.
- 新しい `mysqlaccess`. Thanks to Steve Harvey for this.
- `--i-am-a-dummy` と `--safe-updates` オプションを `mysql` に追加。
- `select_limit` と `max_join_size` 変数を `mysql` に追加。
- SQL の変数を追加： `SQL_MAX_JOIN_SIZE` と `SQL_SAFE_UPDATES`.
- Added `READ LOCAL` lock that doesn't lock the table for concurrent inserts. (This is used by `mysqldump`).
- Changed that `LOCK TABLES ... READ` doesn't anymore allow concurrent inserts.
- オプション `--skip-delay-key-write` を `mysqld` に追加。
- Fixed security problem in the protocol regarding password checking.
- `_rowid` can now be used as an alias for an integer type unique indexed column.
- Added back blocking of `SIGPIPE` when compiling with `--thread-safe-clients` to make things safe for old clients.

### F.2.41 Changes in release 3.23.10

- Fixed bug in 3.23.9 where memory wasn't properly freed when doing `LOCK TABLES`.

### F.2.42 Changes in release 3.23.9

- Fixed problem that affected queries that did arithmetic on group functions.
- Fixed problem with timestamps and `INSERT DELAYED`.
- Fixed that `date_column BETWEEN const_date AND const_date` works.
- Fixed problem when only changing a 0 to `NULL` in a table with `BLOB/TEXT` columns.
- Fixed bug in range optimizer when using many key parts and or on the middle key parts: `WHERE K1=1 and K3=2 and (K2=2 and K4=4 or K2=3 and K4=5)`
- `source` コマンドを `mysql` に追加。 これは `mysql` クライアント内 で、バッチファイルを読むことができる。 Original patch by Matthew Vanecek.
- `WITH GRANT OPTION` オプションの致命的なバグを修正
- Don't give an unnecessary `GRANT` error when using tables from many databases in the same query.
- Added VIO wrapper (needed for SSL support ; By Andrei Errapart and Tnu Samuel).
- Fixed optimizer problem on `SELECT` when using many overlapping indexes. MySQL should now be able to choose keys even better when there is many keys to choose from.
- Changed optimizer to prefer a range key instead of a ref key when the range key can uses more columns than the ref key (which only can use columns with =). For example, the following type of queries should now be faster: `SELECT * from key_part_1=const and key_part_2 > const2`
- Fixed bug that a change of all `VARCHAR` columns to `CHAR` columns didn't change row type from dynamic to fixed.
- Disabled floating-point exceptions for FreeBSD to fix core dump when doing `SELECT floor(pow(2,63))`.
- `mysqld` の起動オプション `--delay-key-write` を `--delay-key-write-for-all-tables` に変更
- Added `read-next-on-key` to `HEAP` tables. This should fix all problems with `HEAP` tables when using not `UNIQUE` keys.
- 変数のデフォルトを表示するオプションをクライアントに追加
- `mysqld` に `--log-slow-queries` を追加。 これは時間のかかった 全てのクエリを別のログファイルに記録する。どのくらい時間がかかったかが記される
- `WHERE key_column=RAND(...)` を行ったときコアを吐くバグを修正
- Fixed optimization bug in `SELECT ... LEFT JOIN ... key_column IS NULL`, when `key_column` could contain `NULL` values.
- Fixed problem with 8-bit characters as separators in `LOAD DATA INFILE`.

### F.2.43 Changes in release 3.23.8

- 8G より大きなインデックスファイルを扱った場合の問題を修正。
- NetBSD 用の最新の mit-pthread のパッチを追加。
- タイムゾーン < GMT - 11 の場合の問題を修正。
- `NISAM` 中のパックされたキーの削除時のバグを修正。
- いくつか `ORDER BY ... DESC` クエリを実行した際の `ISAM` の問題を修正。
- Fixed bug when doing a join on a text key which didn't covert the whole key.
- オプション `--delay-key-write` が delayed key writing を有効にしていなかったのを修正。
- Fixed update of `TEXT` column which only involved case changes.
- Fixed that `INSERT DELAYED` doesn't update timestamps that are given.
- `YEARWEEK()` 関数の追加と、`x`, `X`, `v`, `V` オプションの `DATE_FORMAT()` への追加。
- Fixed problem with `MAX(indexed_column)` and HEAP tables.
- Fixed problem with `BLOB NULL` keys and `LIKE` "prefix%".
- Fixed problem with `MyISAM` and fixed-length rows < 5 bytes.
- Fixed problem that could cause MySQL to touch freed memory when doing very complicated `GROUP BY` queries.
- Fixed core dump if you got a crashed table where an `ENUM` field value was too big.

### F.2.44 Changes in release 3.23.7

- Linux環境下において、`pthread_mutex_timedwait` の問題を避けるようにした。 この関数は `INSERT DELAYED` で使用されていた。 「2.6.1 Linux Notes (All Linux Versions)」節参照.
- Fixed that one will get at 'disk full' error message if one gets disk full when doing sorting (instead of waiting until we got more disk space).
- `MyISAM` で、キーが 250 文字を超えた場合のバグを修正。
- `MyISAM` において、他のスレッドが読んでいるテーブルに対し、 他のスレッドが `INSERT` を同時に行うことができるようになった。
- Added variable `max_write_lock_count` to `mysqld` to force a `READ` lock after a certain number of `WRITE` locks.
- Inverted flag `delayed_key_write` on `show variables`.
- `concurrency` 変数を `thread_concurrency` に改名。
- 以下の関数がマルチバイト・セーフになった： `LOCATE(substr,str)`, `POSITION(substr IN str)`, `LOCATE(substr,str,pos)`, `INSTR(str,substr)`, `LEFT(str,len)`, `RIGHT(str,len)`, `SUBSTRING(str,pos,len)`, `SUBSTRING(str FROM pos FOR len)`, `MID(str,pos,len)`, `SUBSTRING(str,pos)`, `SUBSTRING(str FROM pos)`, `SUBSTRING_INDEX(str,delim,count)`, `RTRIM(str)`, `TRIM([[BOTH | TRAILING] [remstr] FROM] str)`, `REPLACE(str,from_str,to_str)`, `REVERSE(str)`, `INSERT(str,pos,len,newstr)`, `LCASE(str)`, `LOWER(str)`, `UCASE(str)` and `UPPER(str)`; Patch by Wei He.
- Fix core dump when releasing a lock from a non-existent table.
- Remove locks on tables before starting to remove duplicates.
- `FULL` オプションを `SHOW PROCESSLIST` に追加。
- `--verbose` オプションを `mysqladmin` に追加。
- HEAP の MyISAM への自動変換時のバグを修正。
- HEAP テーブルに対して、insert + delete + insert + scan table を行った際の バグを修正。
- Alpha プラットフォーム上での、`REPLACE()` と `LOAD DATA INFILE` のバグを修正。
- `mysqld` 変数に `interactive_timeout` を追加.
- `mysql_data_seek()` の引数を `ulong` から `ulonglong` に 変更.

### F.2.45 Changes in release 3.23.6

- `mysqld` に `-O lower_case_table_names={0|1}` オプションを追加。 これはテーブル名を強制的に小文字にします。
- `SELECT ... INTO DUMPFILE` 追加。
- `mysqld` に `--ansi` オプションを追加。 これはいくつかの関数を `ANSI SQL` 互換にします。
- Temporary tables now starts with `#sql`.
- Added quoting of identifiers with ``` (`"` in `--ansi` mode).
- Changed to use snprintf() when printing floats to avoid some buffer overflows on FreeBSD.
- FreeBSD 上で、`floor()` をオーバーフローセーフにした。
- `--quote-names` オプションを `mysqldump` に追加
- Fixed bug that one could make a part of a `PRIMARY KEY NOT NULL`.
- Fixed `encrypt()` to be thread safe and not reuse buffer.
- MyODBC の `mysql_odbc_escape_string()` 関数が、big5 をサポートした。
- Rewrote the table handler to use classes. This introduces a lot of new code, but will make table handling faster and better.
- ユーザー定義変数のパッチ(Sashaによる)を追加。
- Changed that `FLOAT` and `DOUBLE` (without any length modifiers) are not anymore fixed decimal point numbers.
- `FLOAT(X)` の意味を変更: X <=24 ならば、これは `FLOAT` と同じで、 24 < X <= 53 であるならば `DOUBLE` と同じになります。
- `DECIMAL(X)` は `DECIMAL(X,0)` のエイリアスになりました。 また `DECIMAL` は `DECIMAL(10,0)` のエイリアスになりました。 The same goes for `NUMERIC`.
- `ROW_FORMAT={default | dynamic | static | compressed}` オプションを `CREATE_TABLE` に追加.
- `DELETE FROM table_name` が一時テーブルで動かなかった。
- `CHAR_LENGTH()` 関数をマルチバイトセーフに変更
- `ORD(string)` 関数の追加.

### F.2.46 Changes in release 3.23.5

- 新しいデータハンドリング中のいくつかの Y2K 問題を修正。
- `SELECT DISTINCT ... ORDER BY RAND()` の問題を修正。
- Sergei A. Golubchik による MyISAM のレベルでのテキストサーチのパッチを追加
- キー無しでfull JOIN を使用した際のキャッシュオーバーフローの問題を修正。
- いくつかの configure の問題を修正。
- Some small changes to make parsing faster.
- ALTER TABLE + adding a column after the last field didn't work.
- 2つのキー中でauto_incrementフィールドを使用したときの問題を修正。
- `MyISAM` で auto_increment をサブパートとして使用できるようになった： `CREATE TABLE foo (a int not null auto_increment, b char(5), primary key (b,a))`
- Fixed bug in `MyISAM` with packed char keys that could be `NULL`.
- フィールド名を `CREATE TABLE table_name SELECT ...` 時にとした場合、動かなかった。
- Allow use of `NATIONAL` and `NCHAR` when defining character columns. This is the same as not using `BINARY`.
- `NULL` のフィールドを `PRIMARY KEY` ( `UNIQUE` キー) には 許さなくなった。
- Clear `LAST_INSERT_ID` if one uses this in ODBC: `WHERE auto_increment_column IS NULL`. This seems to fix some problems
- `WHERE auto_increment_column IS NULL` を使用して最後にレコードが挿入された後に、 `SET SQL_AUTO_IS_NULL=0|1` はサーチのハンドリングの on/off になった。
- Added new `mysqld` variable concurrency for Solaris.
- `--relative` オプションを `mysqladmin` に追加。 これは `extended-status` で変更のモニターをする場合、より便利になった。
- 空のテーブルに対して `COUNT(DISTINCT...)` を使用した際のバグを修正。
- 中国語のキャラクターセット `GBK` を追加。
- `LOAD DATA INFILE` を `BLOB` フィールドに使用した際の問題を修正。
- 論理演算子 `~` (negation) を追加。
- `UDF` 関数での問題を修正。

### F.2.47 Changes in release 3.23.4

- `DATETIME` 型を `TIME` フィールドに挿入するとき、'day' を 保存しようと試みなくなった。
- low endian のマシンで float/double の保存の問題を修正。 (これは `SUM()` に影響する.)
- TCP/IP 接続の connect timeout を追加。
- インデックス上で、 `NULL` 値を持つかもしれないものに `LIKE` "%" した際の問題を修正。
- `REVOKE ALL PRIVILEGES` が全ての権限を取り消していなかったのを修正。
- オリジナルのテーブル名と同じ名前で一時テーブルを作れるようにした。
- データベースへの権限をあるユーザーに与えた際、 そのユーザーは他のユーザーに権限を与えることが出来なかった。
- 新コマンド： `SHOW GRANTS FOR user` (by Sinisa).
- 新 `date_add` syntax: `date/datetime + INTERVAL # interval_type`. By Joshua Chamas.
- `LOAD DATA REPLACE` の権限のチェックを修正。
- Solaris 2.7 上での、壊れた include ファイルを自動修正。
- big file system を検出する際のいくつかの configure の問題を修正。
- `REGEXP` はケース非依存になった。もしバイナリ文字でない場合は。

### F.2.48 Changes in release 3.23.3

- NetBSD 上での MIT-pthreads パッチを追加。
- MyISAM 中の range bug を修正。
- `ORDER BY` のデフォルトが再び `ASC` になった。
- `LIMIT` を `UPDATE` に追加。
- 新クライアント関数： `mysql_change_user()`.
- `SHOW VARIABLES` にキャラクターセットを追加。
- `--[whitespace]` コメントをサポートした。
- Allow `INSERT into tbl_name VALUES ()`, that is, you may now specify an empty value list to insert a row in which each column is set to its default value.
- Changed `SUBSTRING(text FROM pos)` to conform to ANSI SQL. (Before this construct returned the rightmost 'pos' characters).
- いくつかのシステム上で `GROUP BY` をともなった `SUM()` は 0 を返すようになった。
- `SHOW TABLE STATUS` の出力を変更。
- `DELAY_KEY_WRITE` オプションを `CREATE TABLE` に追加。
- `AUTO_INCREMENT` をいかなるキーの部分に使用できるようにした。
- `YEAR(NOW())` , `YEAR(CURDATE())` の問題を修正。
- Added `CASE` construct.
- 新刊数 `COALESCE()`.

### F.2.49 Changes in release 3.23.2

- Fixed range optimizer bug: `SELECT * FROM table_name WHERE key_part1 >= const AND (key_part2 = const OR key_part2 = const)`. The bug was that some rows could be duplicated in the result.
- Running `myisamchk` without `-a` updated the index distribution wrong.
- `SET SQL_LOW_PRIORITY_UPDATES=1` gave parse error before.
- `WHERE` 節に使用されているインデックスフィールドを更新できるようになった： `UPDATE tbl_name SET KEY=KEY+1 WHERE KEY > 100`
- Date handling should now be a bit faster.
- Added handling of fuzzy dates (dates where day or month is 0): (Like: 1999-01-00)
- Fixed optimization of `SELECT ... WHERE key_part1=const1 AND key_part_2=const2 AND key_part1=const4 AND key_part2=const4` ; Indextype should be `range` instead of `ref`.
- Linux Alpha 上で `egcs` 1.1.2 optimizer のバグ(`BLOB` 使用時)を修正。
- Fixed problem with `LOCK TABLES` combined with `DELETE FROM table`.
- MyISAM テーブルは `NULL` 値と `BLOB/TEXT` フィールドにキーを許すようになった。
- 以下のJOINがより速くなった： `SELECT ... FROM t1 LEFT JOIN t2 ON ... WHERE t2.not_null_column IS NULL`.
- `ORDER BY` and `GROUP BY` can be done on functions.
- Changed handling of 'const_item' to allow handling of `ORDER BY RAND()`.
- `WHERE key_column = function` でインデックスが使用されるようになった。
- 例えフィールドが全く同じにパックされていなくても、 `WHERE key_column = column_name` でインデックスが使用されるようになった。
- `WHERE column_name IS NULL` でインデックスが使用されるようになった。
- Changed heap tables to be stored in low_byte_first order (to make it easy to convert to MyISAM tables)
- Automatic change of HEAP temporary tables to MyISAM tables in case of 'table is full' errors.
- `--init-file=file_name` オプションを `mysqld` に追加。
- `COUNT(DISTINCT value, [value, ...])`
- `CREATE TEMPORARY TABLE` now creates a temporary table, in its own namespace, that is automatically deleted if connection is dropped.
- 新予約語 (`CASE` を要求): `CASE, THEN, WHEN, ELSE and END`.
- 新関数 `EXPORT_SET()` , `MD5()`.
- GB2312 中国語キャラクターセットをサポート。

### F.2.50 Changes in release 3.23.1

- いくつかのコンパイル問題を修正した。

### F.2.51 Changes in release 3.23.0

- 多くの新しい特徴を備えた新しいテーブル・ハンドラー・ライブラリ( `MyISAM` )。 「7.1 MyISAM Tables」節参照.
- メモリー内に `HEAP` テーブルを作成できるようになりました。 これは探索がとても速いです。
- 大容量ファイルをサポートしているOS上で、大ファイル (63 bit) のサポート。
- 新しい関数 `LOAD_FILE(filename)` 。 これはファイルの中身を文字列値として読みます。
- 新しい演算子 `<=>` 。 これは、 `=` のように振る舞いますが、 もし両辺の引数が `NULL` なら、真を返します。 これはテーブル間の変更の比較に役立ちます。
- ODBC 3.0 `EXTRACT(interval FROM datetime)` 関数の追加。
- `FLOAT(X)` フィールドは、保存した値を丸めません。 これは検索されたときに 科学表記 (1.0 E+10) になるかもしれません。
- `REPLACE` が前よりも速くなった。
- `LIKE` 文字比較を `=` のよに振る舞うように変更； これは `'e' LIKE ''e'` が真になるということです。 (if the line doesn't display correctly, the latter 'e' means a French 'e' with a dot above)
- `SHOW TABLE STATUS` はテーブルについての情報を多く出すようになりました。
- `LIKE` を `SHOW STATUS` コマンドに追加。
- `SHOW COLUMNS` に Privileges 項目を追加。
- `SHOW INDEX` に `packed` と `comment` 項目を追加。
- テーブルへのコメントを追加。 ( `CREATE TABLE ... COMMENT "xxx"`).
- `UNIQUE` を次のように追加： `CREATE TABLE table_name (col int not null UNIQUE)`
- 新 create 構文： `CREATE TABLE table_name SELECT ...`
- 新 create 構文： `CREATE TABLE IF NOT EXISTS ...`
- `CHAR(0)` フィールドの作成を許可した。
- `DATE_FORMAT()` は、フォーマット文字の前に ``%'` が必要になった。
- `DELAYED` が予約語になった。 (sorry about that :( ).
- プロセジャーの例を追加： `analyse`, file: ``sql_analyse.c'`. これはクエリのデータについて説明します。 以下の様にしてみてください：

      SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max elements,[max memory]])

  この プロセジャーは、テーブルのデータをチェックしたい時に、とても役立ちます！
- `BINARY` cast to force a string to be compared case sensitively.
- `--skip-show-database` オプションを `mysqld` に追加。
- `BLOB`/`TEXT` フィールドにおいて、 `UPDATE` された レコードをチェックできるようになりました。
- `INNER JOIN` の追加。 注意: `INNER` は予約語になりました！
- MySQL テーブルのホストにネットマスクをサポートした。 `IP/NETMASK` として、ネットマスクを指定できます。
- If you compare a `NOT NULL DATE/DATETIME` column with `IS NULL`, this is changed to a compare against `0` to satisfy some ODBC applications. (By shreeve@uci.edu).
- `NULL IN (...)` は `0` ではなく `NULL` を返します。 これは `null_column NOT IN (...)` が `NULL` 値にマッチしないのを確実にします。
- `TIME` フィールド中に、浮動小数点の値を入れるのを修正。
- Changed parsing of `TIME` strings to be more strict. Now the fractional second part is detected (and currently skipped). The following formats are supported:
  `[[DAYS] [H]H:]MM:]SS[.fraction]`
  `[[[[[H]H]H]H]MM]SS[.fraction]`
- Detect (and ignore) second fraction part from `DATETIME`.
- `LOW_PRIORITY` 属性を `LOAD DATA INFILE` に追加。
- デフォルトのインデックス名を、フィールドの名前と同じケースにした。
- デフォルトの接続数を 100 に変更。
- `LOAD DATA INFILE` 時に、より大きなバッファを使用するようにした。
- `DECIMAL(x,y)` は ANSI SQL に従って動作するようになった。
- Added aggregate UDF functions. Thanks to Andreas F. Bobak bobak@relog.ch for this!
- `LAST_INSERT_ID()` is now updated for `INSERT INTO ... SELECT`.
- Some small changes to the join table optimizer to make some joins faster.
- `SELECT DISTINCT` が凄く速くなった； これは `MyISAM` の新しい `UNIQUE` を使用します。 MySQL バージョン 3.22 と一つ違う点は、 `DISTINCT` の出力が ソートされないという事です。
- 全ての C クライアント API が、共有ライブラリを柔軟に作成するため、 マクロから関数になりました。 このため、 `mysql_num_fields()` を `MYSQL` ととしてコールできず、この代わりに `mysql_field_count()` を 使用しなくてはなりません。
- `LIBEWRAP` の追加; Patch by Henning P . Schmiedehausen.
- Don't allow `AUTO_INCREMENT` for other than numerical columns.
- `AUTO_INCREMENT` の使用は、フィールドを自動的に `NOT NULL` にします。
- Show `NULL` as the default value for AUTO_INCREMENT columns.
- `SQL_BIG_RESULT` の追加; `SQL_SMALL_RESULT` がデフォルトになりました。
- Added a shared library RPM. This enhancement was contributed by David Fox (dsfox@cogsci.ucsd.edu).
- `--enable-large-files/--disable-large-files` スイッチを `configure` に 追加。 See ``configure.in'` for some systems where this is automatically turned off because of broken implementations.
- `readline` 4.0 にアップグレード
- 新しい `CREATE TABLE` オプション： `PACK_KEYS` と `CHECKSUM`.
- `mysqld` オプションに `--default-table-type` を追加。

## F.3 Changes in release 3.22.x (Older; Still supported)

3.22 は 3.21 より早く、より安全なコードをもち、たくさんの新しい機能が盛り込まれています。 これらの変更を 3.21 に行わないのは、3.21 の安定度を保つためにはとても多くの変更が必要とされるからです。 これらの変更はメジャーバージョンの変更ではないので、簡単に障害もなく 3.22 にアップグレードができます。 「2.5.2 バージョン 3.21 から バージョン 3.22 へのアップグレード」節参照.

3.22 は新しい `DBD-mysql` (1.20xx) ドライバーのみを新しい接続プロトコルに対して使用します！

### F.3.1 Changes in release 3.22.35

- Fixed problem with `STD()`.
- Merged changes from the newest `ISAM` library from 3.23.
- Fixed problem with `INSERT DELAYED`.
- Fixed a bug core dump when using a `LEFT JOIN`/`STRAIGHT_JOIN` on a table with only one row.

### F.3.2 Changes in release 3.22.34

- Fixed problem with `GROUP BY` on `TINYBLOB` columns; This caused bugzilla to not show rows in some queries.
- Had to do total recompile of the Windows binary version as VC++ didn't compile all relevant files for 3.22.33 :(

### F.3.3 Changes in release 3.22.33

- Fixed problems in Windows when locking tables with `LOCK TABLE`
- Quicker kill of `SELECT DISTINCT` queries.

### F.3.4 Changes in release 3.22.32

- 数値を timestamps に保存する際の問題を修正した。
- Fix problem with timezones that have half hour offsets.
- `mysqlhotcopy` - ローカルの MySQL データベースをコピーする ツール. By Tim Bunce.
- `mysqlaccess` が新しくなった. Thanks to Steve Harvey for this.
- Fixed security problem in the protocol regarding password checking.
- Fixed problem that affected queries that did arithmetic on `GROUP` functions.
- Fixed a bug in the `ISAM` code when deleting rows on tables with packed indexes.

### F.3.5 Changes in release 3.22.31

- Windows バージョンでのいくつかの小さなバグ修正

### F.3.6 Changes in release 3.22.30

- Fixed optimizer problem on `SELECT` when using many overlapping indexes.
- Disabled floating-point exceptions for FreeBSD to fix core dump when doing `SELECT floor(pow(2,63))`.
- Added print of default arguments options to all clients.
- `WITH GRANT OPTION` オプションの致命的なバグを修正.
- Fixed non-critical Y2K problem when writing short date to log files.

### F.3.7 Changes in release 3.22.29

- Upgraded the configure and include files to match the latest 3.23 version. This should increase portability and make it easier to build shared libraries.
- NetBSD 用の最新の mit-pthread のパッチを追加。
- タイムゾーン < GMT - 11 の場合の問題を修正。
- `NISAM` 中のパックされたキーの削除時のバグを修正。
- Fixed problem that could cause MySQL to touch freed memory when doing very complicated `GROUP BY` queries.
- Fixed core dump if you got a crashed table where an `ENUM` field value was too big.
- Added `mysqlshutdown.exe` and `mysqlwatch.exe` to the Windows distribution.
- キーに対して `ORDER BY` を行ったときの問題を修正
- Fixed that `INSERT DELAYED` doesn't update timestamps that are given.

### F.3.8 Changes in release 3.22.28

- Fixed problem with `LEFT JOIN` and `COUNT()` on a column which was declared `NULL` + and it had a `DEFAULT` value.
- `CONCAT()` をある `WHERE` 節で使用した際にコア・ダンプする問題を修正した。
- Fixed problem with `AVG()` and `STD()` with `NULL` values.

### F.3.9 Changes in release 3.22.27

- ``my_ctype.h'` 中の、他のキャラクターセットのプロトタイプを修正。
- configure 中の、大ファイルシステムを検出する部分の問題を修正。
- 大きなBLOBフィールドをソートしたときのバグを修正。
- `ROUND()` will now work on Windows.

### F.3.10 Changes in release 3.22.26

- 空の `BLOB/TEXT` フィールドを `REVERSE()` した際にコアダンプしたのを修正。
- `/*! */` バージョン番号 を拡張した
- Changed `SUBSTRING(text FROM pos)` to conform to ANSI SQL. (Before this construct returned the rightmost 'pos' characters).
- Fixed problem with `LOCK TABLES` combined with `DELETE FROM table`
- `INSERT ... SELECT` が `SQL_BIG_TABLES` を使用していなかったのを修正。
- `SET SQL_LOW_PRIORITY_UPDATES=#` が動いてなかった。
- 許可を `GRANT ... IDENTIFIED BY` で変更しても直にパスワードが 反映されなかったのを修正。
- 以下の最適化のバグを修正： `SELECT * FROM table_name WHERE key_part1 >= const AND (key_part2 = const OR key_part2 = const)`
- Fixed bug in compression key handling in ISAM.

### F.3.11 Changes in release 3.22.25

- インストール時の小さな問題を修正。

### F.3.12 Changes in release 3.22.24

- `DATA` は予約語でなくなった。
- たった１レコードしかないテーブルの最適化のバグを修正。
- `LOCK TABLES table_name READ; FLUSH TABLES;` を使用した際のバグ修正。
- HP-UX のパッチを適用。
- `isamchk` が Windows 上で動くようになった。
- Changed ``configure'` to not use big file handling on Linux as this crashes some RedHat 6.0 systems

### F.3.13 Changes in release 3.22.23

- Autoconf 2.13, Automake 1.4, `libtool` 1.3.2 を使用するようにアップグレード。
- Better support for SCO in `configure`.
- Added option `--defaults-file=###` to option file handling to force use of only one specific option file.
- `MySQL` バージョン 3.23 のキーワードを無視するように `CREATE` 構文を拡張した。
- `LOCK TABLES` でロックされているテーブルに `INSERT DELAYED` を 使用した際の、デッドロックの問題を修正。
- 他のスレッドにロックされているテーブルに `DROP TABLE` を使用した際の 問題を修正。
- `GRANT/REVOKE` コマンドを update log に追加。
- 新しいエラー項目を検出するように `isamchk` を修正。
- `NATURAL LEFT JOIN` のバグを修正。

### F.3.14 Changes in release 3.22.22

- `mysql_init()` の後に直接 `mysql_close()` を読んだときの問題を修正。 (C API)
- Better client error message when you can't open socket.
- 新しいdelayed_insert スレッドが作成できなかったときの `delayed_insert_thread` 数の表示を修正。
- `CONCAT()` の引数を多くした場合のバグを修正。
- DEC 3.2 と SCO のパッチの追加。
- NT のサービスとして MySQL をインストールした際の パスの問題を修正。
- MySQL-Windows は VC++ 6.0 でコンパイルされるようになった。 (VC++ 5.0 のかわりに)
- MySQL-Windows の新しいインストーラー

### F.3.15 Changes in release 3.22.21

- テーブルが他のスレッドにロックされたときの、`DELETE FROM TABLE` の 問題を修正。
- Fixed bug in `LEFT JOIN` involving empty tables.
- `mysql.db` フィールドを `char(32)` から `char(60)` に変更。
- `MODIFY` と `DELAYED` は予約語でなくなった。
- `TIME` フィールドに日にちを入れようとしたときのバグを修正。
- `GRANT` コマンドで新しい MySQL ユーザーを登録した後に `Host '...' is not allowed to connect to this MySQL server` となる問題を修正。
- Linux 上で `TCP_NODELAY` を使用するように変更。 (これは TCP/IP 接続を速くします)

### F.3.16 Changes in release 3.22.20

- Fixed `STD()` for big tables when result should be 0.
- いくつかのOS でupdate log が改行を入れていなかったのを修正。
- `INSERT DELAYED` had some garbage at end in the update log.

### F.3.17 Changes in release 3.22.19

- `mysql_install_db` のバグ修正。 (from 3.22.17).
- デフォルトのキーキャッシュを 8M に変更。
- `BLOB` フィールドで一時テーブルが必要とされるクエリの問題を修正。

### F.3.18 Changes in release 3.22.18

- Linux上で、3.22.17の致命的な問題の修正； `shutdown` 後、全ての スレッドが確実に死ななかった。
- `-O flush_time=#` オプションを `mysqld` に追加。 This is mostly useful on Windows and tells how often MySQL should close all unused tables and flush all updated tables to disk.
- `VARCHAR` フィールドと `CHAR` を比較した際にキーを効果的に 使用していなかったのを修正。

### F.3.19 Changes in release 3.22.17

- `--log-update` を使用したときとデフォルトのデータベースを指定しないで 接続したときのコアダンプを修正した。
- いくつかの `configure` と移植性の問題を修正した。
- Using `LEFT JOIN` on tables that had circular dependencies caused `mysqld` to hang forever.

### F.3.20 Changes in release 3.22.16

- `mysqladmin processlist` could kill the server if a new user logged in.
- `DELETE FROM table_name WHERE key_column=column_name` が マッチする行を1行も見つけれないのを修正
- `DATE_ADD(column, ...)` が動かないのを修正
- `INSERT DELAYED` could deadlock with status 'upgrading lock'
- 2文字以上のソルトが使用できるように、`ENCRYPT()` を拡張。
- `longlong2str` は以前よりかなり速くなった。`Intel x86` 用に このコードは最適化されたアセンブラで書き直した
- `ALTER TABLE` に `MODIFY` キーワードを追加

### F.3.21 Changes in release 3.22.15

- `GRANT` を `IDENTIFIED BY` と共に使用した際、権限情報がフラッシュされるまで 有効にならない
- Name change of some variables in `SHOW STATUS`.
- Fixed problem with `ORDER BY` with 'only index' optimization when there were multiple key definitions for a used column.
- `DATE` and `DATETIME` columns are now up to 5 times faster than before.
- `INSERT DELAYED` can be used to let the client do other things while the server inserts rows into a table.
- もし2つの違うデータベースのテーブルを使用した場合、 `LEFT JOIN USING (col1,col2)` が動作しなかった
- `LOAD DATA LOCAL INFILE` がファイルがないための理由で UNIX では動作しなかった
- とても短い行(<4バイト)しかない `VARCHAR`/`BLOB` での問題の修正； error 127 がこの行を消去する場合に起きる可能性があった
- Updating `BLOB/TEXT` through formulas didn't work for short (< 256 char) strings.
- 新しいホスト上で `GRANT` を実行した場合、そのホストからの最初のコネクションで `mysqld` が死ぬ可能性があった
- エイリアス名と同じ項目名を `ORDER BY` で使用する場合のバグを修正 name as an alias.
- Added `BENCHMARK(loop_count,expression)` function to time expressions.

### F.3.22 Changes in release 3.22.14

- シェルスクリプトからの起動のために、`mysqld` の引数がない場合を許可した。
- Setting a `TIMESTAMP` column to `NULL` didn't record the timestamp value in the update log.
- Fixed lock handler bug when one did `INSERT INTO TABLE ... SELECT ... GROUP BY`.
- Added a patch for `localtime_r()` on Windows so that it will not crash anymore if your date is > 2039, but instead will return a time of all zero.
- Names for user-defined functions are no longer case sensitive.
- Added escape of `^Z` (ASCII 26) to `\Z` as `^Z` doesn't work with pipes on Windows.
- 将来の MySQL リリースのために、`mysql_fix_privileges` は、 UDF のサポートのために、新しい項目を `mysql.func` に追加する。 ( type enum ('function','aggregate') NOT NULL が追加された )

### F.3.23 Changes in release 3.22.13

- Saving `NOW()`, `CURDATE()` or `CURTIME()` directly in a column didn't work.
- `WHERE` 節が無い場合、`SELECT COUNT(*) ... LEFT JOIN ...` が動かなかった
- UnixWare 7.0.x で MySQL をコンフィグできるように ``config.guess'` を更新 UnixWare 7.0.x.
- Changed the implementation of `pthread_cond()` on the Windows version. `get_lock()` now correctly times out on Windows!

### F.3.24 Changes in release 3.22.12

- `WHERE` 節で `DATE_ADD()` と `DATE_SUB()` を使用した際の問題を修正
- `GRANT ... TO user IDENTIFIED BY 'password'` 構文でパスワードをセットできるようにした
- 多くのテーブルを `SELECT` して `GRANT` を確認する際のバグを修正
- RPM 配布での `mysql_fix_privilege_tables` ファイルの追加。 これはクライアントパッケージに含んだため、デフォルトでは起動されない。
- `SQL_SMALL_RESULT` オプションを `SELECT` に追加。 これは強制的に速い一時テーブルを使用する。 結果が小さいとわかっている場合に使用すると有効。
- 小数点をつけなくても実数が使用できるようにした
- `DATE_ADD`/`DATE_SUB()` の結果、十分な日数を得られない場合、 日数を月の最大日にするようにした。
- `GRANT` がカラムをケース非依存で比較していたのを修正
- ある構文の組み合わせで `ALTER TABLE` が core をはくバグが ``sql_list.h'` にあったのでこれを修正
- The hostname in `user@hostname` can now include ``.'` and ``-'` without quotes in the context of the `GRANT`, `REVOKE` and `SET PASSWORD FOR ...` statements.
- 大きな一時ファイルを必要とするテーブルへの `isamchk` を修正

### F.3.25 Changes in release 3.22.11

- 重要: 3.22.11にアップグレードする場合、必ず `mysql_fix_privilege_tables` スクリプトを実行しなくてはなりません！ これは新しい `GRANT` システムのために実行します。 もしこれを行わなければ、`ALTER TABLE` や `CREATE INDEX`, `DROP INDEX` を 実行しようとすると `Access denied` になります。
- テーブル、カラムごとにユーザーのアクセスに対して許可や拒否を設定できます
- `USER()` を `user@host` を返すように変更
- 他のユーザーの `PASSWORD` をセットする構文を変更
- 新コマンド：`FLUSH STATUS` はほとんどのステータス変数をゼロにセットします
- 新ステータス変数： `aborted_threads`, `aborted_connects`.
- 新オプション： `connection_timeout`
- ソートのサポート (by Pruet Boonma pruet@ds90.intanon.nectec.or.th).
- スロバキア語と日本語のエラーメッセージ
- Configuration and portability fixes.
- Added option `SET SQL_WARNINGS=1` to get a warning count also for simple inserts.
- FreeBSD 上でシャットダウンするために、`SIGQUIT` のかわりに `SIGTERM` を使用します
- `mysql` に オプション `\G` (print vertically) 追加
- `SELECT HIGH_PRIORITY ...` killed `mysqld`.
- `IS NULL` on a `AUTO_INCREMENT` column in a `LEFT JOIN` didn't work as expected.
- New function `MAKE_SET()`.

### F.3.26 Changes in release 3.22.10

- mysql_install_db は MySQL サーバーを起動しなくなりました! mysql_install_db を行った後に、`safe_mysqld` で mysqld を開始させる必要があります。 しかし MySQL の RPM パッケージはサーバーをたちあげるようにしています。
- `--bootstrap` を `mysqld` に追加。`mysql_install_db` はこれを使用します。 この引数は RPM パッケージで MySQL のインストールを簡略化します。
- `+, - (sign and minus), *, /, %, ABS() and MOD()` のコードを修正。 `BIGINT`で使用した場合の危険性を回避しました(64 bit safe).
- `ALTER TABLE` が mysqld をクラッシュさせるバグを修正。
- 重複したキー結果を得た場合、MySQLは常にその旨を報告するようになりました。 (以前のバージョンでは、`INSERT` の時にしかメッセージが出ませんでした)
- New syntax: `INSERT INTO table_name SET column=value,column=value, ...`
- ``.err'` ログファイルのログ記録に、time stamp をつけるようにしました。
- `MYSQL_INIT_COMMAND` オプションを `mysql_options()` に追加。 (接続要求する場合に使用できる)
- `MYSQL_READ_DEFAULT_FILE` と `MYSQL_READ_DEFAULT_GROUP` を `mysql_options()`に追加。 MySQL オプションファイルから以下のパラメーターを読み取る： `port`, `socket`, `compress`, `password`, `pipe`, `timeout`, `user`, `init-command`, `host` and `database` (訳注)オプションファイルのデフォルトは /etc/my.cnf , install_directory/share/mysql/my.cnf
- UDF 構文に `maybe_null` を追加
- Added option `IGNORE` to `INSERT` statements with many rows.
- koi8 キャラクターをソートする場合の問題を修正。 koi8を使用しているユーザーは、`CHAR` や `VARCHAR` カラムを インデックスにしているテーブルに対して、必ず `isamchk -rq` を実行すること。
- 新規スクリプト `mysql_setpermission` (Luuk de Boer 作) これは指定されたデータベースに対してアクセスを許可するユーザーを 簡単に登録してくれます。
- Allow use of hexadecimal strings (0x...) when specifying a constant string (like in the column separators with `LOAD DATA INFILE`).
- OS/2 に移植 (thanks to Antony T. Curtis antony.curtis@olcs.net).
- `SHOW STATUS` での変数を増やしました。また、`SHOW VARIABLES` の ような出力フォーマットに変更しました。
- `extended-status` コマンドを `mysqladmin` に追加。 これは新しいステイタス変数を表示します

### F.3.27 Changes in release 3.22.9

- `SET SQL_LOG_UPDATE=0` caused a lockup of the server.
- New SQL command: `FLUSH [ TABLES | HOSTS | LOGS | PRIVILEGES ] [, ...]`
- New SQL command: `KILL` `thread_id` .
- AIX, DEC OSF1 4.x で MySQL を簡単にコンパイルできるように include ファイルを変更。
- `ALTER TABLE` を使用して `INT` からサイズの小さい `CHAR()` に 変更する場合におきていた不具合を修正。
- `SELECT HIGH_PRIORITY` 追加。 `SELECT` において、たとえ他の `SELECT` を待っているスレッドがあったとしても、 `WRITE LOCK` することができます。
- Moved wild_compare to string class to be able to use `LIKE` on `BLOB`/`TEXT` columns with \0.
- Added `ESCAPE` option to `LIKE`
- `mysqladmin debug` において、より多くの出力が得られるようにした。
- Windows において、`--flush` オプションをつけて `mysqld` を起動できるようになりました。 これはアップデートが終わった後ですべてのテーブルをディスクにフラッシュします。 このオプションにより NT/Win98 上ですごく安全に動かすことができますが、 とても 遅くなります。

### F.3.28 Changes in release 3.22.8

- Czech character sets should now work much better. You must also install http://www.mysql.com/Downloads/Patches/czech-3.22.8-patch. This patch should also be installed if you are using a character set with uses `my_strcoll()`! The patch should always be safe to install (for any system), but as this patch changes ISAM internals it's not yet in the default distribution.
- `DATE_ADD()` and `DATE_SUB()` didn't work with group functions.
- `mysql` will now also try to reconnect on `USE DATABASE` commands.
- Fix problem with `ORDER BY` and `LEFT JOIN` and `const` tables.
- Fixed problem with `ORDER BY` if the first `ORDER BY` column was a key and the rest of the `ORDER BY` columns wasn't part of the key.
- Fixed a big problem with `OPTIMIZE TABLE`.
- MySQL clients on NT will now by default first try to connect with named pipes and after this with TCP/IP.
- Fixed a problem with `DROP TABLE` and `mysqladmin shutdown` on Windows (a fatal bug from 3.22.6).
- Fixed problems with `TIME columns` and negative strings.
- Added an extra thread signal loop on shutdown to avoid some error messages from the client.
- MySQL now uses the next available number as extension for the update log file.
- Added patches for UNIXWARE 7.

### F.3.29 Changes in release 3.22.7

- Added `LIMIT` clause for the `DELETE` statement.
- You can now use the `/*! ... */` syntax to hide MySQL-specific keywords when you write portable code. MySQL will parse the code inside the comments as if the surrounding `/*!` and `*/` comment characters didn't exist.
- `OPTIMIZE TABLE tbl_name` can now be used to reclaim disk space after many deletes. Currently, this uses `ALTER TABLE` to re-generate the table, but in the future it will use an integrated `isamchk` for more speed.
- Upgraded `libtool` to get the configure more portable.
- Fixed slow `UPDATE` and `DELETE` operations when using `DATETIME` or `DATE` keys.
- Changed optimizer to make it better at deciding when to do a full join and when using keys.
- You can now use `mysqladmin proc` to display information about your own threads. Only users with the Process_priv privilege can get information about all threads.
- Added handling of formats `YYMMDD`, `YYYYMMDD`, `YYMMDDHHMMSS` for numbers when using `DATETIME` and `TIMESTAMP` types. (Formerly these formats only worked with strings.)
- Added connect option `CLIENT_IGNORE_SPACE` to allow use of spaces after function names and before ``('` (Powerbuilder requires this). This will make all function names reserved words.
- Added the `--log-long-format` option to `mysqld` to enable timestamps and INSERT_ID's in the update log.
- Added `--where` option to `mysqldump` (patch by Jim Faucette).
- The lexical analyzer now uses ``perfect hashing'' for faster parsing of SQL statements.

### F.3.30 Changes in release 3.22.6

- Faster `mysqldump`.
- For the `LOAD DATA INFILE` statement, you can now use the new `LOCAL` keyword to read the file from the client. `mysqlimport` will automatically use `LOCAL` when importing with the TCP/IP protocol.
- Fixed small optimize problem when updating keys.
- Changed makefiles to support shared libraries.
- MySQL-NT can now use named pipes, which means that you can now use MySQL-NT without having to install TCP/IP.

### F.3.31 Changes in release 3.22.5

- All table lock handing is changed to avoid some very subtle deadlocks when using `DROP TABLE`, `ALTER TABLE`, `DELETE FROM TABLE` and `mysqladmin flush-tables` under heavy usage. Changed locking code to get better handling of locks of different types.
- Updated `DBI` to 1.00 and `DBD` to 1.2.0.
- Added a check that the error message file contains error messages suitable for the current version of `mysqld`. (To avoid errors if you accidentally try to use an old error message file.)
- All count structures in the client (`affected_rows()`, `insert_id()`, ...) are now of type `BIGINT` to allow 64-bit values to be used. This required a minor change in the MySQL protocol which should affect only old clients when using tables with `AUTO_INCREMENT` values > 16M.
- The return type of `mysql_fetch_lengths()` has changed from `uint *` to `ulong *`. This may give a warning for old clients but should work on most machines.
- Change `mysys` and `dbug` libraries to allocate all thread variables in one struct. This makes it easier to make a threaded ``libmysql.dll'` library.
- Use the result from `gethostname()` (instead of `uname()`) when constructing ``.pid'` file names.
- New better compressed server/client protocol.
- `COUNT()`, `STD()` and `AVG()` are extended to handle more than 4G rows.
- You can now store values in the range `-838:59:59` <= x <= `838:59:59` in a `TIME` column.
- WARNING: INCOMPATIBLE CHANGE!! If you set a `TIME` column to too short a value, MySQL now assumes the value is given as: `[[[D ]HH:]MM:]SS` instead of `HH[:MM[:SS]]`.
- `TIME_TO_SEC()` and `SEC_TO_TIME()` can now handle negative times and hours up to 32767.
- Added new option `SET OPTION SQL_LOG_UPDATE={0|1}` to allow users with the process privilege to bypass the update log. (Modified patch from Sergey A Mukhin violet@rosnet.net.)
- Fixed fatal bug in `LPAD()`.
- Initialize line buffer in ``mysql.cc'` to make `BLOB` reading from pipes safer.
- Added `-O max_connect_errors=#` option to `mysqld`. Connect errors are now reset for each correct connection.
- Increased the default value of `max_allowed_packet` to `1M` in `mysqld`.
- Added `--low-priority-updates` option to `mysqld`, to give table-modifying operations (`INSERT`, `REPLACE`, `UPDATE`, `DELETE`) lower priority than retrievals. You can now use `{INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ...` You can also use `SET OPTION SQL_LOW_PRIORITY_UPDATES={0|1}` to change the priority for one thread. One side effect is that `LOW_PRIORITY` is now a reserved word. :(
- Add support for `INSERT INTO table ... VALUES(...),(...),(...)`, to allow inserting multiple rows with a single statement.
- `INSERT INTO tbl_name` is now also cached when used with `LOCK TABLES`. (Previously only `INSERT ... SELECT` and `LOAD DATA INFILE` were cached.)
- Allow `GROUP BY` functions with `HAVING`:

      mysql> SELECT col FROM table GROUP BY col HAVING COUNT(*)>0;

- `mysqld` will now ignore trailing ``;'` characters in queries. This is to make it easier to migrate from some other SQL servers that require the trailing ``;'`.
- Fix for corrupted fixed-format output generated by `SELECT INTO OUTFILE`.
- WARNING: INCOMPATIBLE CHANGE!! Added Oracle `GREATEST()` and `LEAST()` functions. You must now use these instead of the `MAX()` and `MIN()` functions to get the largest/smallest value from a list of values. These can now handle `REAL`, `BIGINT` and string (`CHAR` or `VARCHAR`) values.
- WARNING: INCOMPATIBLE CHANGE!! `DAYOFWEEK()` had offset 0 for Sunday. Changed the offset to 1.
- Give an error for queries that mix `GROUP BY` columns and fields when there is no `GROUP BY` specification.
- Added `--vertical` option to `mysql`, for printing results in vertical mode.
- Index-only optimization; some queries are now resolved using only indexes. Until MySQL 4.0, this works only for numeric columns. 「5.4.3 MySQL はどのようにインデックスを使用するか？」節参照.
- Lots of new benchmarks.
- A new C API chapter and lots of other improvements in the manual.

### F.3.32 Changes in release 3.22.4

- Added `--tmpdir` option to `mysqld`, for specifying the location of the temporary file directory.
- MySQL now automatically changes a query from an ODBC client:

      SELECT ... FROM table WHERE auto_increment_column IS NULL

  to:

      SELECT ... FROM table WHERE auto_increment_column == LAST_INSERT_ID()

  This allows some ODBC programs (Delphi, Access) to retrieve the newly inserted row to fetch the `AUTO_INCREMENT` id.
- `DROP TABLE` now waits for all users to free a table before deleting it.
- Fixed small memory leak in the new connect protocol.
- New functions `BIN()`, `OCT()`, `HEX()` and `CONV()` for converting between different number bases.
- Added function `SUBSTRING()` with 2 arguments.
- If you created a table with a record length smaller than 5, you couldn't delete rows from the table.
- Added optimization to remove const reference tables from `ORDER BY` and `GROUP BY`.
- `mysqld` now automatically disables system locking on Linux and Windows, and for systems that use MIT-pthreads. You can force the use of locking with the `--enable-locking` option.
- Added `--console` option to `mysqld`, to force a console window (for error messages) when using Windows.
- Fixed table locks for Windows.
- Allow ``$'` in identifiers.
- Changed name of user-specific configuration file from ``my.cnf'` to ``.my.cnf'` (Unix only).
- Added `DATE_ADD()` and `DATE_SUB()` functions.

### F.3.33 Changes in release 3.22.3

- Fixed a lock problem (bug in MySQL Version 3.22.1) when closing temporary tables.
- Added missing `mysql_ping()` to the client library.
- Added `--compress` option to all MySQL clients.
- Changed `byte` to `char` in ``mysql.h'` and ``mysql_com.h'`.

### F.3.34 Changes in release 3.22.2

- Searching on multiple constant keys that matched more than 30% of the rows didn't always use the best possible key.
- New functions `<<`, `>>`, `RPAD()` and `LPAD()`.
- You can now save default options (like passwords) in a configuration file (``my.cnf'`).
- Lots of small changes to get `ORDER BY` to work when no records are found when using fields that are not in `GROUP BY` (MySQL extension).
- Added `--chroot` option to `mysqld`, to start `mysqld` in a chroot environment (by Nikki Chumakov nikkic@cityline.ru).
- Trailing spaces are now ignored when comparing case-sensitive strings; this should fix some problems with ODBC and flag 512!
- Fixed a core-dump bug in the range optimizer.
- Added `--one-thread` option to `mysqld`, for debugging with LinuxThreads (or `glibc`). (This replaces the `-T32` flag)
- Added `DROP TABLE IF EXISTS` to prevent an error from occurring if the table doesn't exist.
- `IF` and `EXISTS` are now reserved words (they would have to be sooner or later).
- Added lots of new options to `mysqldump`.
- Server error messages are now in ``mysqld_error.h'`.
- The server/client protocol now supports compression.
- All bug fixes from MySQL Version 3.21.32.

### F.3.35 Changes in release 3.22.1

- Added new C API function `mysql_ping()`.
- Added new API functions `mysql_init()` and `mysql_options()`. You now MUST call `mysql_init()` before you call `mysql_real_connect()`. You don't have to call `mysql_init()` if you only use `mysql_connect()`.
- Added `mysql_options(...,MYSQL_OPT_CONNECT_TIMEOUT,...)` so you can set a timeout for connecting to a server.
- Added `--timeout` option to `mysqladmin`, as a test of `mysql_options()`.
- Added `AFTER column` and `FIRST` options to `ALTER TABLE ... ADD columns`. This makes it possible to add a new column at some specific location within a row in an existing table.
- `WEEK()` now takes an optional argument to allow handling of weeks when the week starts on Monday (some European countries). By default, `WEEK()` assumes the week starts on Sunday.
- `TIME` columns weren't stored properly (bug in MySQL Version 3.22.0).
- `UPDATE` now returns information about how many rows were matched and updated, and how many ``warnings'' occurred when doing the update.
- Fixed incorrect result from `FORMAT(-100,2)`.
- `ENUM` and `SET` columns were compared in binary (case-sensitive) fashion; changed to be case insensitive.

### F.3.36 Changes in release 3.22.0

- New (backward compatible) connect protocol that allows you to specify the database to use when connecting, to get much faster connections to a specific database. The `mysql_real_connect()` call is changed to:

      mysql_real_connect(MYSQL *mysql, const char *host, const char *user,
                         const char *passwd, const char *db, uint port,
                         const char *unix_socket, uint client_flag)

- Each connection is handled by its own thread, rather than by the master `accept()` thread. This fixes permanently the telnet bug that was a topic on the mail list some time ago.
- All TCP/IP connections are now checked with backward resolution of the hostname to get better security. `mysqld` now has a local hostname resolver cache so connections should actually be faster than before, even with this feature.
- A site automatically will be blocked from future connections if someone repeatedly connects with an ``improper header'' (like when one uses telnet).
- You can now refer to tables in different databases with references of the form `tbl_name@db_name` or `db_name.tbl_name`. This makes it possible to give a user read access to some tables and write access to others simply by keeping them in different databases!
- Added `--user` option to `mysqld`, to allow it to run as another Unix user (if it is started as the Unix `root` user).
- Added caching of users and access rights (for faster access rights checking)
- Normal users (not anonymous ones) can change their password with `mysqladmin password 'new_password'`. This uses encrypted passwords that are not logged in the normal MySQL log!
- All important string functions are now coded in assembler for x86 Linux machines. This gives a speedup of 10% in many cases.
- For tables that have many columns, the column names are now hashed for much faster column name lookup (this will speed up some benchmark tests a lot!)
- Some benchmarks are changed to get better individual timing. (Some loops were so short that a specific test took < 2 seconds. The loops have been changed to take about 20 seconds to make it easier to compare different databases. A test that took 1-2 seconds before now takes 11-24 seconds, which is much better)
- Re-arranged `SELECT` code to handle some very specific queries involving group functions (like `COUNT(*)`) without a `GROUP BY` but with `HAVING`. The following now works:

      mysql> SELECT count(*) as C FROM table HAVING C > 1;

- Changed the protocol for field functions to be faster and avoid some calls to `malloc()`.
- Added `-T32` option to `mysqld`, for running all queries under the main thread. This makes it possible to debug `mysqld` under Linux with `gdb`!
- Added optimization of `not_null_column IS NULL` (needed for some Access queries).
- Allow `STRAIGHT_JOIN` to be used between two tables to force the optimizer to join them in a specific order.
- String functions now return `VARCHAR` rather than `CHAR` and the column type is now `VARCHAR` for fields saved as `VARCHAR`. This should make the MyODBC driver better, but may break some old MySQL clients that don't handle `FIELD_TYPE_VARCHAR` the same way as `FIELD_TYPE_CHAR`.
- `CREATE INDEX` and `DROP INDEX` are now implemented through `ALTER TABLE`. `CREATE TABLE` is still the recommended (fast) way to create indexes.
- Added `--set-variable` option `wait_timeout` to `mysqld`.
- Added time column to `mysqladmin processlist` to show how long a query has taken or how long a thread has slept.
- Added lots of new variables to `show variables` and some new to `show status`.
- Added new type `YEAR`. `YEAR` is stored in 1 byte with allowable values of 0, and 1901 to 2155.
- Added new `DATE` type that is stored in 3 bytes rather than 4 bytes. All new tables are created with the new date type if you don't use the `--old-protocol` option to `mysqld`.
- Fixed bug in record caches; for some queries, you could get `Error from table handler: #` on some operating systems.
- Added `--enable-assembler` option to `configure`, for x86 machines (tested on Linux + `gcc`). This will enable assembler functions for the most important string functions for more speed!

## F.4 Changes in release 3.21.x

Version 3.21 is quite old now, and should be avoided if possible. This information is kept here for historical purposes only.

### F.4.1 Changes in release 3.21.33

- Fixed problem when sending `SIGHUP` to `mysqld`; `mysqld` core dumped when starting from boot on some systems.
- Fixed problem with losing a little memory for some connections.
- `DELETE FROM tbl_name` without a `WHERE` condition is now done the long way when you use `LOCK TABLES` or if the table is in use, to avoid race conditions.
- `INSERT INTO TABLE (timestamp_column) VALUES (NULL);` didn't set timestamp.

### F.4.2 Changes in release 3.21.32

- Fixed some possible race conditions when doing many reopen/close on the same tables under heavy load! This can happen if you execute `mysqladmin refresh` often. This could in some very rare cases corrupt the header of the index file and cause error 126 or 138.
- Fixed fatal bug in `refresh()` when running with the `--skip-locking` option. There was a ``very small'' time gap after a `mysqladmin refresh` when a table could be corrupted if one thread updated a table while another thread did `mysqladmin refresh` and another thread started a new update ont the same table before the first thread had finished. A refresh (or `--flush-tables`) will now not return until all used tables are closed!
- `SELECT DISTINCT` with a `WHERE` clause that didn't match any rows returned a row in some contexts (bug only in 3.21.31).
- `GROUP BY` + `ORDER BY` returned one empty row when no rows where found.
- Fixed a bug in the range optimizer that wrote `Use_count: Wrong count for ...` in the error log file.

### F.4.3 Changes in release 3.21.31

- Fixed a sign extension problem for the `TINYINT` type on Irix.
- Fixed problem with `LEFT("constant_string",function)`.
- Fixed problem with `FIND_IN_SET()`.
- `LEFT JOIN` core dumped if the second table is used with a constant `WHERE/ON` expression that uniquely identifies one record.
- Fixed problems with `DATE_FORMAT()` and incorrect dates. `DATE_FORMAT()` now ignores `'%'` to make it possible to extend it more easily in the future.

### F.4.4 Changes in release 3.21.30

- `mysql` now returns an exit code > 0 if the query returned an error.
- Saving of command line history to file in `mysql` client. By Tommy Larsen tommy@mix.hive.no.
- Fixed problem with empty lines that were ignored in ``mysql.cc'`.
- Save the pid of the signal handler thread in the pid file instead of the pid of the main thread.
- tommy@valley.ne.jp による日本語キャラクターセット(SJIS, UJIS)のサポート.
- Changed `safe_mysqld` to redirect startup messages to `'hostname'.err` instead of `'hostname'.log` to reclaim file space on `mysqladmin refresh`.
- `ENUM` always had the first entry as default value.
- `ALTER TABLE` wrote two entries to the update log.
- `sql_acc()` now closes the `mysql` grant tables after a reload to save table space and memory.
- Changed `LOAD DATA` to use less memory with tables and `BLOB` columns.
- Sorting on a function which made a division / 0 produced a wrong set in some cases.
- Fixed `SELECT` problem with `LEFT()` when using the czech character set.
- Fixed problem in `isamchk`; it couldn't repair a packed table in a very unusual case.
- `SELECT` statements with `&` or `|` (bit functions) failed on columns with `NULL` values.
- When comparing a field = field, where one of the fields was a part key, only the length of the part key was compared.

### F.4.5 Changes in release 3.21.29

- `LOCK TABLES` + `DELETE from tbl_name` never removed locks properly.
- Fixed problem when grouping on an `OR` function.
- Fixed permission problem with `umask()` and creating new databases.
- Fixed permission problem on result file with `SELECT ... INTO OUTFILE ...`
- Fixed problem in range optimizer (core dump) for a very complex query.
- Fixed problem when using `MIN(integer)` or `MAX(integer)` in `GROUP BY`.
- Fixed bug on Alpha when using integer keys. (Other keys worked on Alpha).
- Fixed bug in `WEEK("XXXX-xx-01")`.

### F.4.6 Changes in release 3.21.28

- Fixed socket permission (clients couldn't connect to Unix socket on Linux).
- Fixed bug in record caches; for some queries, you could get `Error from table handler: #` on some operating systems.

### F.4.7 Changes in release 3.21.27

- Added user level lock functions `GET_LOCK(string,timeout)`, `RELEASE_LOCK(string)`.
- Added `opened_tables` to `show status`.
- Changed connect timeout to 3 seconds to make it somewhat harder for crackers to kill `mysqld` through telnet + TCP/IP.
- Fixed bug in range optimizer when using `WHERE key_part_1 >= something AND key_part_2 <= something_else`.
- Changed `configure` for detection of FreeBSD 3.0 9803xx and above
- `WHERE` with string_column_key = constant_string didn't always find all rows if the column had many values differing only with characters of the same sort value (like e and 'e).
- Strings keys looked up with 'ref' were not compared in case-sensitive fashion.
- Added `umask()` to make log files non-readable for normal users.
- Ignore users with old (8-byte) password on startup if not using `--old-protocol` option to `mysqld`.
- `SELECT` which matched all key fields returned the values in the case of the matched values, not of the found values. (Minor problem.)

### F.4.8 Changes in release 3.21.26

- `FROM_DAYS(0)` now returns "0000-00-00".
- In `DATE_FORMAT()`, PM and AM were swapped for hours 00 and 12.
- Extended the default maximum key size to 256.
- Fixed bug when using `BLOB`/`TEXT` in `GROUP BY` with many tables.
- An `ENUM` field that is not declared `NOT NULL` has `NULL` as the default value. (Previously, the default value was the first enumeration value.)
- Fixed bug in the join optimizer code when using many part keys on the same key: `INDEX (Organization,Surname(35),Initials(35))`.
- Added some tests to the table order optimizer to get some cases with `SELECT ... FROM many_tables` much faster.
- Added a retry loop around `accept()` to possibly fix some problems on some Linux machines.

### F.4.9 Changes in release 3.21.25

- Changed `typedef 'string'` to `typedef 'my_string'` for better portability.
- You can now kill threads that are waiting on a disk-full condition.
- Fixed some problems with UDF functions.
- Added long options to `isamchk`. Try `isamchk --help`.
- Fixed a bug when using 8 bytes long (alpha); `filesort()` didn't work. Affects `DISTINCT`, `ORDER BY` and `GROUP BY` on 64-bit processors.

### F.4.10 Changes in release 3.21.24

- Dynamic loadable functions. Based on source from Alexis Mikhailov.
- You couldn't delete from a table if no one had done a `SELECT` on the table.
- Fixed problem with range optimizer with many `OR` operators on key parts inside each other.
- Recoded `MIN()` and `MAX()` to work properly with strings and `HAVING`.
- Changed default umask value for new files from `0664` to `0660`.
- Fixed problem with `LEFT JOIN` and constant expressions in the `ON` part.
- Added Italian error messages from brenno@dewinter.com.
- `configure` now works better on OSF1 (tested on 4.0D).
- Added hooks to allow `LIKE` optimization with international character support.
- Upgraded `DBI` to 0.93.

### F.4.11 Changes in release 3.21.23

- The following symbols are now reserved words: `TIME`, `DATE`, `TIMESTAMP`, `TEXT`, `BIT`, `ENUM`, `NO`, `ACTION`, `CHECK`, `YEAR`, `MONTH`, `DAY`, `HOUR`, `MINUTE`, `SECOND`, `STATUS`, `VARIABLES`.
- Setting a `TIMESTAMP` to `NULL` in `LOAD DATA INFILE ...` didn't set the current time for the `TIMESTAMP`.
- Fix `BETWEEN` to recognize binary strings. Now `BETWEEN` is case sensitive.
- Added `--skip-thread-priority` option to `mysqld`, for systems where `mysqld`'s thread scheduling doesn't work properly (BSDI 3.1).
- Added ODBC functions `DAYNAME()` and `MONTHNAME()`.
- Added function `TIME_FORMAT()`. This works like `DATE_FORMAT()`, but takes a time string (`'HH:MM:DD'`) as argument.
- Fixed unlikely(?) key optimizer bug when using `OR`s of key parts inside `AND`s.
- Added command `variables` to `mysqladmin`.
- A lot of small changes to the binary releases.
- Fixed a bug in the new protocol from MySQL Version 3.21.20.
- Changed `ALTER TABLE` to work with Windows (Windows can't rename open files). Also fixed a couple of small bugs in the Windows version.
- All standard MySQL clients are now ported to MySQL-Windows.
- MySQL can now be started as a service on NT.

### F.4.12 Changes in release 3.21.22

- Starting with this version, all MySQL distributions will be configured, compiled and tested with `crash-me` and the benchmarks on the following platforms: SunOS 5.6 sun4u, SunOS 5.5.1 sun4u, SunOS 4.14 sun4c, SunOS 5.6 i86pc, Irix 6.3 mips5k, HP-UX 10.20 hppa, AIX 4.2.1 ppc, OSF1 V4.0 alpha, FreeBSD 2.2.2 i86pc and BSDI 3.1 i386.
- Fix `COUNT(*)` problems when the `WHERE` clause didn't match any records. (Bug from 3.21.17.)
- Removed that `NULL = NULL` is true. Now you must use `IS NULL` or `IS NOT NULL` to test whether or not a value is `NULL`. (This is according to ANSI SQL but may break old applications that are ported from `mSQL`.) You can get the old behavior by compiling with `-DmSQL_COMPLIANT`.
- Fixed bug that core dumped when using many `LEFT OUTER JOIN` clauses.
- Fixed bug in `ORDER BY` on string formula with possible `NULL` values.
- Fixed problem in range optimizer when using <= on sub index.
- Added functions `DAYOFYEAR()`, `DAYOFMONTH()`, `MONTH()`, `YEAR()`, `WEEK()`, `QUARTER()`, `HOUR()`, `MINUTE()`, `SECOND()` and `FIND_IN_SET()`.
- Added command `SHOW VARIABLES`.
- Added support of ``long constant strings'' from ANSI SQL:

      mysql> SELECT 'first ' 'second';       -> 'first second'

- Upgraded mSQL-Mysql-modules to 1.1825.
- Upgraded `mysqlaccess` to 2.02.
- Fixed problem with Russian character set and `LIKE`.
- Ported to OpenBSD 2.1.
- New Dutch error messages.

### F.4.13 Changes in release 3.21.21a

- Configure changes for some operating systems.

### F.4.14 Changes in release 3.21.21

- Fixed optimizer bug when using `WHERE data_field = date_field2 AND date_field2 = constant`.
- Added command `SHOW STATUS`.
- Removed ``manual.ps'` from the source distribution to make it smaller.

### F.4.15 Changes in release 3.21.20

- Changed the maximum table name and column name lengths from 32 to 64.
- Aliases can now be of ``any'' length.
- Fixed `mysqladmin stat` to return the right number of queries.
- Changed protocol (downward compatible) to mark if a column has the `AUTO_INCREMENT` attribute or is a `TIMESTAMP`. This is needed for the new Java driver.
- Added Hebrew sorting order by Zeev Suraski.
- Solaris 2.6: Fixed `configure` bugs and increased maximum table size from 2G to 4G.

### F.4.16 Changes in release 3.21.19

- Upgraded `DBD` to 1823. This version implements `mysql_use_result` in `DBD-Mysql`.
- Benchmarks updated for empress (by Luuk).
- Fixed a case of slow range searching.
- Configure fixes (``Docs'` directory).
- Added function `REVERSE()` (by Zeev Suraski).

### F.4.17 Changes in release 3.21.18

- Issue error message if client C functions are called in wrong order.
- Added automatic reconnect to the ``libmysql.c'` library. If a write command fails, an automatic reconnect is done.
- Small sort sets no longer use temporary files.
- Upgraded `DBI` to 0.91.
- Fixed a couple of problems with `LEFT OUTER JOIN`.
- Added `CROSS JOIN` syntax. `CROSS` is now a reserved word.
- Recoded `yacc`/`bison` stack allocation to be even safer and to allow MySQL to handle even bigger expressions.
- Fixed a couple of problems with the update log.
- `ORDER BY` was slow when used with key ranges.

### F.4.18 Changes in release 3.21.17

- Changed documentation string of `--with-unix-socket-path` to avoid confusion.
- Added ODBC and ANSI SQL style `LEFT OUTER JOIN`.
- The following are new reserved words: `LEFT`, `NATURAL`, `USING`.
- The client library now uses the value of the environment variable `MYSQL_HOST` as the default host if it's defined.
- `SELECT col_name, SUM(expr)` now returns `NULL` for `col_name` when there are matching rows.
- Fixed problem with comparing binary strings and `BLOB`s with ASCII characters over 127.
- Fixed lock problem: when freeing a read lock on a table with multiple read locks, a thread waiting for a write lock would have been given the lock. This shouldn't affect data integrity, but could possibly make `mysqld` restart if one thread was reading data that another thread modified.
- `LIMIT offset,count` didn't work in `INSERT ... SELECT`.
- Optimized key block caching. This will be quicker than the old algorithm when using bigger key caches.

### F.4.19 Changes in release 3.21.16

- Added ODBC 2.0 & 3.0 functions `POWER()`, `SPACE()`, `COT()`, `DEGREES()`, `RADIANS()`, `ROUND(2 arg)` and `TRUNCATE()`.
- WARNING: INCOMPATIBLE CHANGE!! `LOCATE()` parameters were swapped according to ODBC standard. Fixed.
- Added function `TIME_TO_SEC()`.
- In some cases, default values were not used for `NOT NULL` fields.
- Timestamp wasn't always updated properly in `UPDATE SET ...` statements.
- Allow empty strings as default values for `BLOB` and `TEXT`, to be compatible with `mysqldump`.

### F.4.20 Changes in release 3.21.15

- WARNING: INCOMPATIBLE CHANGE!! `mysqlperl` is now from Msql-Mysql-modules. This means that `connect()` now takes `host`, `database`, `user`, `password` arguments! The old version took `host`, `database`, `password`, `user`.
- Allow `DATE '1997-01-01'`, `TIME '12:10:10'` and `TIMESTAMP '1997-01-01 12:10:10'` formats required by ANSI SQL. WARNING: INCOMPATIBLE CHANGE!! This has the unfortunate side-effect that you no longer can have columns named `DATE`, `TIME` or `TIMESTAMP`. :( Old columns can still be accessed through `tablename.columnname`!)
- Changed Makefiles to hopefully work better with BSD systems. Also, ``manual.dvi'` is now included in the distribution to avoid having stupid `make` programs trying to rebuild it.
- `readline` library upgraded to version 2.1.
- A new sortorder german-1. That is a normal ISO-Latin1 with a german sort order.
- Perl `DBI`/`DBD` is now included in the distribution. `DBI` is now the recommended way to connect to MySQL from Perl.
- New portable benchmark suite with `DBD`, with test results from `mSQL` 2.0.3, MySQL, PostgreSQL 6.2.1 and Solid server 2.2.
- `crash-me` is now included with the benchmarks; This is a Perl program designed to find as many limits as possible in a SQL server. Tested with `mSQL`, PostgreSQL, Solid and MySQL.
- Fixed bug in range-optimizer that crashed MySQL on some queries.
- Table and column name completion for `mysql` command line tool, by Zeev Suraski and Andi Gutmans.
- Added new command `REPLACE` that works like `INSERT` but replaces conflicting records with the new record. `REPLACE INTO TABLE ... SELECT ...` works also.
- Added new commands `CREATE DATABASE db_name` and `DROP DATABASE db_name`.
- Added `RENAME` option to `ALTER TABLE`: `ALTER TABLE name RENAME TO new_name`.
- `make_binary_distribution` now includes ``libgcc.a'` in ``libmysqlclient.a'`. This should make linking work for people who don't have `gcc`.
- Changed `net_write()` to `my_net_write()` because of a name conflict with Sybase.
- New function `DAYOFWEEK()` compatible with ODBC.
- Stack checking and `bison` memory overrun checking to make MySQL safer with weird queries.

### F.4.21 Changes in release 3.21.14b

- Fixed a couple of small `configure` problems on some platforms.

### F.4.22 Changes in release 3.21.14a

- Ported to SCO Openserver 5.0.4 with FSU Pthreads.
- HP-UX 10.20 should work.
- Added new function `DATE_FORMAT()`.
- Added `NOT IN`.
- Added automatic removal of 'ODBC function conversions': `{fn now() }`
- Handle ODBC 2.50.3 option flags.
- Fixed comparison of `DATE` and `TIME` values with `NULL`.
- Changed language name from germany to german to be consistent with the other language names.
- Fixed sorting problem on functions returning a `FLOAT`. Previously, the values were converted to `INT`s before sorting.
- Fixed slow sorting when sorting on key field when using `key_column=constant`.
- Sorting on calculated `DOUBLE` values sorted on integer results instead.
- `mysql` no longer needs a database argument.
- Changed the place where `HAVING` should be. According to ANSI, it should be after `GROUP BY` but before `ORDER BY`. MySQL Version 3.20 incorrectly had it last.
- Added Sybase command `USE DATABASE` to start using another database.
- Added automatic adjusting of number of connections and table cache size if the maximum number of files that can be opened is less than needed. This should fix that `mysqld` doesn't crash even if you haven't done a `ulimit -n 256` before starting `mysqld`.
- Added lots of limit checks to make it safer when running with too little memory or when doing weird queries.

### F.4.23 Changes in release 3.21.13

- Added retry of interrupted reads and clearing of `errno`. This makes Linux systems much safer!
- Fixed locking bug when using many aliases on the same table in the same `SELECT`.
- Fixed bug with `LIKE` on number key.
- New error message so you can check whether the connection was lost while the command was running or whether the connection was down from the start.
- Added `--table` option to `mysql` to print in table format. Moved time and row information after query result. Added automatic reconnect of lost connections.
- Added `!=` as a synonym for `<>`.
- Added function `VERSION()` to make easier logs.
- New multi-user test ``tests/fork_test.pl'` to put some strain on the thread library.

### F.4.24 Changes in release 3.21.12

- Fixed `ftruncate()` call in MIT-pthreads. This made `isamchk` destroy the ``.ISM'` files on (Free)BSD 2.x systems.
- Fixed broken `__P_` patch in MIT-pthreads.
- Many memory overrun checks. All string functions now return `NULL` if the returned string should be longer than `max_allowed_packet` bytes.
- Changed the name of the `INTERVAL` type to `ENUM`, because `INTERVAL` is used in ANSI SQL.
- In some cases, doing a `JOIN` + `GROUP` + `INTO OUTFILE`, the result wasn't grouped.
- `LIKE` with `'_'` as last character didn't work. Fixed.
- Added extended ANSI SQL `TRIM()` function.
- Added `CURTIME()`.
- Added `ENCRYPT()` function by Zeev Suraski.
- Fixed better `FOREIGN KEY` syntax skipping. New reserved words: `MATCH`, `FULL`, `PARTIAL`.
- `mysqld` now allows IP number and hostname to the `--bind-address` option.
- Added `SET OPTION CHARACTER SET cp1251_koi8` to enable conversions of data to/from cp1251_koi8.
- Lots of changes for Win95 port. In theory, this version should now be easily portable to Win95.
- Changed the `CREATE COLUMN` syntax of `NOT NULL` columns to be after the `DEFAULT` value, as specified in the ANSI SQL standard. This will make `mysqldump` with `NOT NULL` and default values incompatible with MySQL Version 3.20.
- Added many function name aliases so the functions can be used with ODBC or ANSI SQL92 syntax.
- Fixed syntax of `ALTER TABLE tbl_name ALTER COLUMN col_name SET DEFAULT NULL`.
- Added `CHAR` and `BIT` as synonyms for `CHAR(1)`.
- Fixed core dump when updating as a user who has only select privilege.
- `INSERT ... SELECT ... GROUP BY` didn't work in some cases. An `Invalid use of group function` error occurred.
- When using `LIMIT`, `SELECT` now always uses keys instead of record scan. This will give better performance on `SELECT` and a `WHERE` that matches many rows.
- Added Russian error messages.

### F.4.25 Changes in release 3.21.11

- Configure changes.
- MySQL now works with the new thread library on BSD/OS 3.0.
- Added new group functions `BIT_OR()` and `BIT_AND()`.
- Added compatibility functions `CHECK` and `REFERENCES`. `CHECK` is now a reserved word.
- Added `ALL` option to `GRANT` for better compatibility. (`GRANT` is still a dummy function.)
- Added partly-translated dutch messages.
- Fixed bug in `ORDER BY` and `GROUP BY` with `NULL` columns.
- Added function `last_insert_id()` to retrieve last `AUTO_INCREMENT` value. This is intended for clients to ODBC that can't use the `mysql_insert_id()` API function, but can be used by any client.
- Added `--flush-logs` option to `mysqladmin`.
- Added command `STATUS` to `mysql`.
- Fixed problem with `ORDER BY`/`GROUP BY` because of bug in `gcc`.
- Fixed problem with `INSERT ... SELECT ... GROUP BY`.

### F.4.26 Changes in release 3.21.10

- New `mysqlaccess`.
- `CREATE` now supports all ODBC types and the `mSQL` `TEXT` type. All ODBC 2.5 functions are also supported (added `REPEAT`). This provides better portability.
- Added text types `TINYTEXT`, `TEXT`, `MEDIUMTEXT` and `LONGTEXT`. These are actually `BLOB`types, but all searching is done in case-insensitive fashion.
- All old `BLOB` fields are now `TEXT` fields. This only changes that all searching on strings is done in case-sensitive fashion. You must do an `ALTER TABLE` and change the field type to `BLOB` if you want to have tests done in case-sensitive fashion.
- Fixed some `configure` issues.
- Made the locking code a bit safer. Fixed very unlikely deadlock situation.
- Fixed a couple of bugs in the range optimizer. Now the new range benchmark `test-select` works.

### F.4.27 Changes in release 3.21.9

- Added `--enable-unix-socket=pathname` option to `configure`.
- Fixed a couple of portability problems with include files.
- Fixed bug in range calculation that could return empty set when searching on multiple key with only one entry (very rare).
- Most things ported to FSU Pthreads, which should allow MySQL to run on SCO. 「2.6.6.9 SCO Notes」節参照.

### F.4.28 Changes in release 3.21.8

- Works now in Solaris 2.6.
- Added handling of calculation of `SUM()` functions. For example, you can now use `SUM(column)/COUNT(column)`.
- Added handling of trigometric functions: `PI()`, `ACOS()`, `ASIN()`, `ATAN()`, `COS()`, `SIN()` and `TAN()`.
- New languages: norwegian, norwegian-ny and portuguese.
- Fixed parameter bug in `net_print()` in ``procedure.cc'`.
- Fixed a couple of memory leaks.
- Now allow also the old `SELECT ... INTO OUTFILE` syntax.
- Fixed bug with `GROUP BY` and `SELECT` on key with many values.
- `mysql_fetch_lengths()` sometimes returned incorrect lengths when you used `mysql_use_result()`. This affected at least some cases of `mysqldump --quick`.
- Fixed bug in optimization of `WHERE const op field`.
- Fixed problem when sorting on `NULL` fields.
- Fixed a couple of 64-bit (Alpha) problems.
- Added `--pid-file=#` option to `mysqld`.
- Added date formatting to `FROM_UNIXTIME()`, originally by Zeev Suraski.
- Fixed bug in `BETWEEN` in range optimizer (Did only test = of the first argument).
- Added machine-dependent files for MIT-pthreads i386-SCO. There is probably more to do to get this to work on SCO 3.5.

### F.4.29 Changes in release 3.21.7

- Changed ``Makefile.am'` to take advantage of Automake 1.2.
- Added the beginnings of a benchmark suite.
- Added more secure password handling.
- Added new client function `mysql_errno()`, to get the error number of the error message. This makes error checking in the client much easier. This makes the new server incompatible with the 3.20.x server when running without `--old-protocol`. The client code is backward compatible. More information can be found in the ``README'` file!
- Fixed some problems when using very long, illegal names.

### F.4.30 Changes in release 3.21.6

- Fixed more portability issues (incorrect `sigwait` and `sigset` defines).
- `configure` should now be able to detect the last argument to `accept()`.

### F.4.31 Changes in release 3.21.5

- Should now work with FreeBSD 3.0 if used with ``FreeBSD-3.0-libc_r-1.0.diff'`, which can be found at http://www.mysql.com/Downloads/Patches/.
- Added new option `-O tmp_table_size=#` to `mysqld`.
- New function `FROM_UNIXTIME(timestamp)` which returns a date string in 'YYYY-MM-DD HH:MM:DD' format.
- New function `SEC_TO_TIME(seconds)` which returns a string in 'HH:MM:SS' format.
- New function `SUBSTRING_INDEX()`, originally by Zeev Suraski.

### F.4.32 Changes in release 3.21.4

- Should now configure and compile on OSF1 4.0 with the DEC compiler.
- Configuration and compilation on BSD/OS 3.0 works, but due to some bugs in BSD/OS 3.0, `mysqld` doesn't work on it yet.
- Configuration and compilation on FreeBSD 3.0 works, but I couldn't get `pthread_create` to work.

### F.4.33 Changes in release 3.21.3

- Added reverse check lookup of hostnames to get better security.
- Fixed some possible buffer overflows if filenames that are too long are used.
- `mysqld` doesn't accept hostnames that start with digits followed by a `'.'`, because the hostname may look like an IP number.
- Added `--skip-networking` option to `mysqld`, to only allow socket connections. (This will not work with MIT-pthreads!)
- Added check of too long table names for alias.
- Added check if database name is okay.
- Added check if too long table names.
- Removed incorrect `free()` that killed the server on `CREATE DATABASE` or `DROP DATABASE`.
- Changed some `mysqld` `-O` options to better names.
- Added `-O join_cache_size=#` option to `mysqld`.
- Added `-O max_join_size=#` option to `mysqld`, to be able to set a limit how big queries (in this case big = slow) one should be able to handle without specifying `SET OPTION SQL_BIG_SELECTS=1`. A # = is about 10 examined records. The default is ``unlimited''.
- When comparing a `TIME`, `DATE`, `DATETIME` or `TIMESTAMP` column to a constant, the constant is converted to a time value before performing the comparison. This will make it easier to get ODBC (particularly Access97) to work with the above types. It should also make dates easier to use and the comparisons should be quicker than before.
- Applied patch from Jochen Wiedmann that allows `query()` in `mysqlperl` to take a query with `\0` in it.
- Storing a timestamp with a 2-digit year (`YYMMDD`) didn't work.
- Fix that timestamp wasn't automatically updated if set in an `UPDATE` clause.
- Now the automatic timestamp field is the FIRST timestamp field.
- `SELECT * INTO OUTFILE`, which didn't correctly if the outfile already existed.
- `mysql` now shows the thread ID when starting or doing a reconnect.
- Changed the default sort buffer size from 2M to 1M.

### F.4.34 Changes in release 3.21.2

- The range optimizer is coded, but only 85% tested. It can be enabled with `--new`, but it crashes core a lot yet...
- More portable. Should compile on AIX and alpha-digital. At least the `isam` library should be relatively 64-bit clean.
- New `isamchk` which can detect and fix more problems.
- New options for `isamlog`.
- Using new version of Automake.
- Many small portability changes (from the AIX and alpha-digital port) Better checking of pthread(s) library.
- czech error messages by snajdr@pvt.net.
- Decreased size of some buffers to get fewer problems on systems with little memory. Also added more checks to handle ``out of memory'' problems.
- `mysqladmin`: you can now do `mysqladmin kill 5,6,7,8` to kill multiple threads.
- When the maximum connection limit is reached, one extra connection by a user with the PROCESS_ACL privilege is granted.
- Added `-O backlog=#` option to `mysqld`.
- Increased maximum packet size from 512K to 1024K for client.
- Almost all of the function code is now tested in the internal test suite.
- `ALTER TABLE` now returns warnings from field conversions.
- Port changed to 3306 (got it reserved from ISI).
- Added a fix for Visual FoxBase so that any schema name from a table specification is automatically removed.
- New function `ASCII()`.
- Removed function `BETWEEN(a,b,c)`. Use the standard ANSI syntax instead: `expr BETWEEN expr AND expr`.
- MySQL no longer has to use an extra temporary table when sorting on functions or `SUM()` functions.
- Fixed bug that you couldn't use `tbl_name.field_name` in `UPDATE`.
- Fixed `SELECT DISTINCT` when using 'hidden group'. For example:

      mysql> SELECT DISTINCT MOD(some_field,10) FROM test
                 GROUP BY some_field;

  Note: `some_field` is normally in the `SELECT` part. ANSI SQL should require it.

### F.4.35 Changes in release 3.21.0

- New reserved words used: `INTERVAL`, `EXPLAIN`, `READ`, `WRITE`, `BINARY`.
- Added ODBC function `CHAR(num,...)`.
- New operator `IN`. This uses a binary search to find a match.
- New command `LOCK TABLES tbl_name [AS alias] {READ|WRITE} ...`
- Added `--log-update` option to `mysqld`, to get a log suitable for incremental updates.
- New command `EXPLAIN SELECT ...` to get information about how the optimizer will do the join.
- For easier client code, the client should no longer use `FIELD_TYPE_TINY_BLOB`, `FIELD_TYPE_MEDIUM_BLOB`, `FIELD_TYPE_LONG_BLOB` or `FIELD_TYPE_VAR_STRING` (as previously returned by `mysql_list_fields`). You should instead only use `FIELD_TYPE_BLOB` or `FIELD_TYPE_STRING`. If you want exact types, you should use the command `SHOW FIELDS`.
- Added varbinary syntax: `0x######` which can be used as a string (default) or a number.
- `FIELD_TYPE_CHAR` is renamed to `FIELD_TYPE_TINY`.
- Changed all fields to C++ classes.
- Removed FORM struct.
- Fields with `DEFAULT` values no longer need to be `NOT NULL`.
- New field types:
  `ENUM`
    A string which can take only a couple of defined values. The value is stored as a 1-3 byte number that is mapped automatically to a string. This is sorted according to string positions!
  `SET`
    A string which may have one or many string values separated with ','. The string is stored as a 1-, 2-, 3-, 4- or 8-byte number where each bit stands for a specific set member. This is sorted according to the unsigned value of the stored packed number.
- Now all function calculation is done with `double` or `long long`. This will provide the full 64-bit range with bit functions and fix some conversions that previously could result in precision losses. One should avoid using `unsigned long long` columns with full 64-bit range (numbers bigger than 9223372036854775807) because calculations are done with `signed long long`.
- `ORDER BY` will now put `NULL` field values first. `GROUP BY` will also work with `NULL` values.
- Full `WHERE` with expressions.
- New range optimizer that can resolve ranges when some keypart prefix is constant. Example:

      mysql> SELECT * FROM tbl_name
                 WHERE key_part_1="customer"
                 AND key_part_2>=10 AND key_part_2<=10;

## F.5 Changes in release 3.20.x

Version 3.20 is quite old now, and should be avoided if possible. This information is kept here for historical purposes only.

Changes from 3.20.18 to 3.20.32b are not documented here because the 3.21 release branched here. And the relevant changes are also documented as changes to the 3.21 version.

### F.5.1 Changes in release 3.20.18

- Added `-p#` (remove `#` directories from path) to `isamlog`. All files are written with a relative path from the database directory Now `mysqld` shouldn't crash on shutdown when using the `--log-isam` option.
- New `mysqlperl` version. It is now compatible with `msqlperl-0.63`.
- New `DBD` module available at http://www.mysql.com/Downloads/Contrib/ site.
- Added group function `STD()` (standard deviation).
- The `mysqld` server is now compiled by default without debugging information. This will make the daemon smaller and faster.
- Now one usually only has to specify the `--basedir` option to `mysqld`. All other paths are relative in a normal installation.
- `BLOB` columns sometimes contained garbage when used with a `SELECT` on more than one table and `ORDER BY`.
- Fixed that calculations that are not in `GROUP BY` work as expected (ANSI SQL extension). Example:

      mysql> SELECT id,id+1 FROM table GROUP BY id;

- The test of using `MYSQL_PWD` was reversed. Now `MYSQL_PWD` is enabled as default in the default release.
- Fixed conversion bug which caused `mysqld` to core dump with Arithmetic error on Sparc-386.
- Added `--unbuffered` option to `mysql`, for new `mysqlaccess`.
- When using overlapping (unnecessary) keys and join over many tables, the optimizer could get confused and return 0 records.

### F.5.2 Changes in release 3.20.17

- You can now use `BLOB` columns and the functions `IS NULL` and `IS NOT NULL` in the `WHERE` clause.
- All communication packets and row buffers are now allocated dynamically on demand. The default value of `max_allowed_packet` is now 64K for the server and 512K for the client. This is mainly used to catch incorrect packets that could trash all memory. The server limit may be changed when it is started.
- Changed stack usage to use less memory.
- Changed `safe_mysqld` to check for running daemon.
- The `ELT()` function is renamed to `FIELD()`. The new `ELT()` function returns a value based on an index: `FIELD()` is the inverse of `ELT()` Example: `ELT(2,"A","B","C")` returns `"B"`. `FIELD("B","A","B","C")` returns `2`.
- `COUNT(field)`, where `field` could have a `NULL` value, now works.
- A couple of bugs fixed in `SELECT ... GROUP BY`.
- Fixed memory overrun bug in `WHERE` with many unoptimizable brace levels.
- Fixed some small bugs in the grant code.
- If hostname isn't found by `get_hostname`, only the IP is checked. Previously, you got `Access denied`.
- Inserts of timestamps with values didn't always work.
- `INSERT INTO ... SELECT ... WHERE` could give the error `Duplicated field`.
- Added some tests to `safe_mysqld` to make it ``safer''.
- `LIKE` was case sensitive in some places and case insensitive in others. Now `LIKE` is always case insensitive.
- ``mysql.cc'`: Allow `'#'` anywhere on the line.
- New command `SET OPTION SQL_SELECT_LIMIT=#`. See the FAQ for more details.
- New version of the `mysqlaccess` script.
- Change `FROM_DAYS()` and `WEEKDAY()` to also take a full `TIMESTAMP` or `DATETIME` as argument. Before they only took a number of type `YYYYMMDD` or `YYMMDD`.
- Added new function `UNIX_TIMESTAMP(timestamp_column)`.

### F.5.3 Changes in release 3.20.16

- More changes in MIT-pthreads to get them safer. Fixed also some link bugs at least in SunOS.
- Changed `mysqld` to work around a bug in MIT-pthreads. This makes multiple small `SELECT` operations 20 times faster. Now `lock_test.pl` should work.
- Added `mysql_FetchHash(handle)` to `mysqlperl`.
- The `mysqlbug` script is now distributed built to allow for reporting bugs that appear during the build with it.
- Changed ``libmysql.c'` to prefer `getpwuid()` instead of `cuserid()`.
- Fixed bug in `SELECT` optimizer when using many tables with the same column used as key to different tables.
- Added new latin2 and Russian KOI8 character tables.
- Added support for a dummy `GRANT` command to satisfy Powerbuilder.

### F.5.4 Changes in release 3.20.15

- Fixed fatal bug `packets out of order` when using MIT-pthreads.
- Removed possible loop when a thread waits for command from client and `fcntl()` fails. Thanks to Mike Bretz for finding this bug.
- Changed alarm loop in ``mysqld.cc'` because shutdown didn't always succeed in Linux.
- Removed use of `termbits` from ``mysql.cc'`. This conflicted with `glibc` 2.0.
- Fixed some syntax errors for at least BSD and Linux.
- Fixed bug when doing a `SELECT` as superuser without a database.
- Fixed bug when doing `SELECT` with group calculation to outfile.

### F.5.5 Changes in release 3.20.14

- If one gives `-p` or `--password` option to `mysql` without an argument, the user is solicited for the password from the tty.
- Added default password from `MYSQL_PWD` (by Elmar Haneke).
- Added command `kill` to `mysqladmin` to kill a specific MySQL thread.
- Sometimes when doing a reconnect on a down connection this succeeded first on second try.
- Fixed adding an `AUTO_INCREMENT` key with `ALTER_TABLE`.
- `AVG()` gave too small value on some `SELECT`s with `GROUP BY` and `ORDER BY`.
- Added new `DATETIME` type (by Giovanni Maruzzelli maruzz@matrice.it).
- Fixed that define `DONT_USE_DEFAULT_FIELDS` works.
- Changed to use a thread to handle alarms instead of signals on Solaris to avoid race conditions.
- Fixed default length of signed numbers. (George Harvey georgeh@pinacl.co.uk.)
- Allow anything for `CREATE INDEX`.
- Add prezeros when packing numbers to `DATE`, `TIME` and `TIMESTAMP`.
- Fixed a bug in `OR` of multiple tables (gave empty set).
- Added many patches to MIT-pthreads. This fixes at least one lookup bug.

### F.5.6 Changes in release 3.20.13

- Added ANSI SQL94 `DATE` and `TIME` types.
- Fixed bug in `SELECT` with `AND`-`OR` levels.
- Added support for Slovenian characters. The ``Contrib'` directory contains source and instructions for adding other character sets.
- Fixed bug with `LIMIT` and `ORDER BY`.
- Allow `ORDER BY` and `GROUP BY` on items that aren't in the `SELECT` list. (Thanks to Wim Bonis bonis@kiss.de, for pointing this out.)
- Allow setting of timestamp values in `INSERT`.
- Fixed bug with `SELECT ... WHERE ... = NULL`.
- Added changes for `glibc` 2.0. To get `glibc` to work, you should add the ``gibc-2.0-sigwait-patch'` before compiling `glibc`.
- Fixed bug in `ALTER TABLE` when changing a `NOT NULL` field to allow `NULL` values.
- Added some ANSI92 synonyms as field types to `CREATE TABLE`. `CREATE TABLE` now allows `FLOAT(4)` and `FLOAT(8)` to mean `FLOAT` and `DOUBLE`.
- New utility program `mysqlaccess` by Yves.Carlier@rug.ac.be. This program shows the access rights for a specific user and the grant rows that determine this grant.
- Added `WHERE const op field` (by bonis@kiss.de).

### F.5.7 Changes in release 3.20.11

- When using `SELECT ... INTO OUTFILE`, all temporary tables are ISAM instead of HEAP to allow big dumps.
- Changed date functions to be string functions. This fixed some ``funny'' side effects when sorting on dates.
- Extended `ALTER TABLE` according to SQL92.
- Some minor compatibility changes.
- Added `--port` and `--socket` options to all utility programs and `mysqld`.
- Fixed MIT-pthreads `readdir_r()`. Now `mysqladmin create database` and `mysqladmin drop database` should work.
- Changed MIT-pthreads to use our `tempnam()`. This should fix the ``sort aborted'' bug.
- Added sync of records count in `sql_update`. This fixed slow updates on first connection. (Thanks to Vaclav Bittner for the test.)

### F.5.8 Changes in release 3.20.10

- New insert type: `INSERT INTO ... SELECT ...`
- `MEDIUMBLOB` fixed.
- Fixed bug in `ALTER TABLE` and `BLOB`s.
- `SELECT ... INTO OUTFILE` now creates the file in the current database directory.
- `DROP TABLE` now can take a list of tables.
- Oracle synonym `DESCRIBE` (`DESC`).
- Changes to `make_binary_distribution`.
- Added some comments to installation instructions about `configure`'s C++ link test.
- Added `--without-perl` option to `configure`.
- Lots of small portability changes.

### F.5.9 Changes in release 3.20.9

- `ALTER TABLE` didn't copy null bit. As a result, fields that were allowed to have `NULL` values were always `NULL`.
- `CREATE` didn't take numbers as `DEFAULT`.
- Some compatibility changes for SunOS.
- Removed ``config.cache'` from old distribution.

### F.5.10 Changes in release 3.20.8

- Fixed bug with `ALTER TABLE` and multi-part keys.

### F.5.11 Changes in release 3.20.7

- New commands: `ALTER TABLE`, `SELECT ... INTO OUTFILE` and `LOAD DATA INFILE`.
- New function: `NOW()`.
- Added new field file_priv to `mysql/user` table.
- New script `add_file_priv` which adds the new field file_priv to the `user` table. This script must be executed if you want to use the new `SELECT ... INTO` and `LOAD DATA INFILE ...` commands with a version of MySQL earlier than 3.20.7.
- Fixed bug in locking code, which made `lock_test.pl` test fail.
- New files ``NEW'` and ``BUGS'`.
- Changed ``select_test.c'` and ``insert_test.c'` to include ``config.h'`.
- Added command `status` to `mysqladmin` for short logging.
- Increased maximum number of keys to 16 and maximum number of key parts to 15.
- Use of sub keys. A key may now be a prefix of a string field.
- Added `-k` option to `mysqlshow`, to get key information for a table.
- Added long options to `mysqldump`.

### F.5.12 Changes in release 3.20.6

- Portable to more systems because of MIT-pthreads, which will be used automatically if `configure` cannot find a `-lpthreads` library.
- Added GNU-style long options to almost all programs. Test with ``program` --help`.
- Some shared library support for Linux.
- The FAQ is now in ``.texi'` format and is available in ``.html'`, ``.txt'` and ``.ps'` formats.
- Added new SQL function `RAND([init])`.
- Changed `sql_lex` to handle `\0` unquoted, but the client can't send the query through the C API, because it takes a str pointer. You must use `mysql_real_query()` to send the query.
- Added API function `mysql_get_client_info()`.
- `mysqld` now uses the `N_MAX_KEY_LENGTH` from ``nisam.h'` as the maximum allowed key length.
- The following now works:

      mysql> SELECT filter_nr,filter_nr FROM filter ORDER BY filter_nr;

  Previously, this resulted in the error: `Column: 'filter_nr' in order clause is ambiguous`.
- `mysql` now outputs `'\0'`, `'\t'`, `'\n'` and `'\\'` when encountering ASCII 0, tab, newline or `'\'` while writing tab-separated output. This is to allow printing of binary data in a portable format. To get the old behavior, use `-r` (or `--raw`).
- Added german error messages (60 of 80 error messages translated).
- Added new API function `mysql_fetch_lengths(MYSQL_RES *)`, which returns an array of column lengths (of type `uint`).
- Fixed bug with `IS NULL` in `WHERE` clause.
- Changed the optimizer a little to get better results when searching on a key part.
- Added `SELECT` option `STRAIGHT_JOIN` to tell the optimizer that it should join tables in the given order.
- Added support for comments starting with `'--'` in ``mysql.cc'` (Postgres syntax).
- You can have `SELECT` expressions and table columns in a `SELECT` which are not used in the group part. This makes it efficient to implement lookups. The column that is used should be a constant for each group because the value is calculated only once for the first row that is found for a group.

      mysql> SELECT id,lookup.text,sum(*) FROM test,lookup
               WHERE test.id=lookup.id GROUP BY id;

- Fixed bug in `SUM(function)` (could cause a core dump).
- Changed `AUTO_INCREMENT` placement in the SQL query:

      INSERT into table (auto_field) values (0);

  inserted 0, but it should insert an `AUTO_INCREMENT` value.
- ``mysqlshow.c'`: Added number of records in table. Had to change the client code a little to fix this.
- `mysql` now allows doubled `''` or `""` within strings for embedded `'` or `"`.
- New math functions: `EXP()`, `LOG()`, `SQRT()`, `ROUND()`, `CEILING()`.

### F.5.13 Changes in release 3.20.3

- The `configure` source now compiles a thread-free client library `-lmysqlclient`. This is the only library that needs to be linked with client applications. When using the binary releases, you must link with `-lmysql -lmysys -ldbug -lstrings` as before.
- New `readline` library from `bash-2.0`.
- LOTS of small changes to `configure` and makefiles (and related source).
- It should now be possible to compile in another directory using `VPATH`. Tested with GNU Make 3.75.
- `safe_mysqld` and `mysql.server` changed to be more compatible between the source and the binary releases.
- `LIMIT` now takes one or two numeric arguments. If one argument is given, it indicates the maximum number of rows in a result. If two arguments are given, the first argument indicates the offset of the first row to return, the second is the maximum number of rows. With this it's easy to do a poor man's next page/previous page WWW application.
- Changed name of SQL function `FIELDS()` to `ELT()`. Changed SQL function `INTERVALL()` to `INTERVAL()`.
- Made `SHOW COLUMNS` a synonym for `SHOW FIELDS`. Added compatibility syntax `FRIEND KEY` to `CREATE TABLE`. In MySQL, this creates a non-unique key on the given columns.
- Added `CREATE INDEX` and `DROP INDEX` as compatibility functions. In MySQL, `CREATE INDEX` only checks if the index exists and issues an error if it doesn't exist. `DROP INDEX` always succeeds.
- ``mysqladmin.c'`: added client version to version information.
- Fixed core dump bug in `sql_acl` (core on new connection).
- Removed `host`, `user` and `db` tables from database `test` in the distribution.
- `FIELD_TYPE_CHAR` can now be signed (-128 - 127) or unsigned (0 - 255) Previously, it was always unsigned.
- Bug fixes in `CONCAT()` and `WEEKDAY()`.
- Changed a lot of source to get `mysqld` to be compiled with SunPro compiler.
- SQL functions must now have a `'('` immediately after the function name (no intervening space). For example, `'user('` is regarded as beginning a function call, and `'user ('` is regarded as an identifier `user` followed by a `'('`, not as a function call.

### F.5.14 Changes in release 3.20.0

- The source distribution is done with `configure` and Automake. It will make porting much easier. The `readline` library is included in the distribution.
- Separate client compilation: the client code should be very easy to compile on systems which don't have threads.
- The old Perl interface code is automatically compiled and installed. Automatic compiling of `DBD` will follow when the new `DBD` code is ported.
- Dynamic language support: `mysqld` can now be started with Swedish or English (default) error messages.
- New functions: `INSERT()`, `RTRIM()`, `LTRIM()` and `FORMAT()`.
- `mysqldump` now works correctly for all field types (even `AUTO_INCREMENT`). The format for `SHOW FIELDS FROM tbl_name` is changed so the `Type` column contains information suitable for `CREATE TABLE`. In previous releases, some `CREATE TABLE` information had to be patched when re-creating tables.
- Some parser bugs from 3.19.5 (`BLOB` and `TIMESTAMP`) are corrected. `TIMESTAMP` now returns different date information depending on its create length.
- Changed parser to allow a database, table or field name to start with a number or `'_'`.
- All old C code from Unireg changed to C++ and cleaned up. This makes the daemon a little smaller and easier to understand.
- A lot of small bug fixes done.
- New ``INSTALL'` files (not final version) and some information regarding porting.

## F.6 Changes in release 3.19.x

Version 3.19 is quite old now, and should be avoided if possible. This information is kept here for historical purposes only.

### F.6.1 Changes in release 3.19.5

- Some new functions, some more optimization on joins.
- Should now compile clean on Linux (2.0.x).
- Added functions `DATABASE()`, `USER()`, `POW()`, `LOG10()` (needed for ODBC).
- In a `WHERE` with an `ORDER BY` on fields from only one table, the table is now preferred as first table in a multi-join.
- `HAVING` and `IS NULL` or `IS NOT NULL` now works.
- A group on one column and a sort on a group function (`SUM()`, `AVG()`...) didn't work together. Fixed.
- `mysqldump`: Didn't send password to server.

### F.6.2 Changes in release 3.19.4

- Fixed horrible locking bug when inserting in one thread and reading in another thread.
- Fixed one-off decimal bug. 1.00 was output as 1.0.
- Added attribute `'Locked'` to process list as info if a query is locked by another query.
- Fixed full magic timestamp. Timestamp length may now be 14, 12, 10, 8, 6, 4 or 2 bytes.
- Sort on some numeric functions could sort incorrectly on last number.
- `IF(arg,syntax_error,syntax_error)` crashed.
- Added functions `CEILING()`, `ROUND()`, `EXP()`, `LOG()` and `SQRT()`.
- Enhanced `BETWEEN` to handle strings.

### F.6.3 Changes in release 3.19.3

- Fixed `SELECT` with grouping on `BLOB` columns not to return incorrect `BLOB` info. Grouping, sorting and distinct on `BLOB` columns will not yet work as expected (probably it will group/sort by the first 7 characters in the `BLOB`). Grouping on formulas with a fixed string size (use `MID()` on a `BLOB`) should work.
- When doing a full join (no direct keys) on multiple tables with `BLOB` fields, the `BLOB` was garbage on output.
- Fixed `DISTINCT` with calculated columns.

Go to the first, previous, next, last section, table of contents.