This appendix lists the features that we plan to implement in MySQL.
Everything in this list is approximately in the order it will be done. If you want to affect the priority order, please register a license or support us and tell us what you want to have done more quickly. See section 3 MySQL Licensing and Support.
The plan is that we in the future will support the full ANSI SQL99 standard, but with a lot of useful extensions. The challenge is to do this without sacrifying the speed or compromise the code.
We plan to make MySQL Version 4.0 a ``quick'' release where we only add some new stuff to enable others to help us with developing new features into Version 4.1. The MySQL 4.0 version should only take us about a month to make after which we want to stabilize it and start working on Version 4.1. Version 4.0 should have the following new features:
The news section for 4.0 includes a list of the features we have already implemented in the 4.0 tree. See section F.1 Changes in release 4.0.x (Development; Alpha).
.frm files) This will enable us
to not run out of bits when adding more table options.  One will still
be able to use the old .frm file format with 4.0.  All newly created
tables will, however, use the new format.
The new file format will enable us to add new column types, more options
for keys and FOREIGN KEY support.
mysqld as a library.  This will have the same interface as the
standard MySQL client (with an extra function to just set up
startup parameters) but will be faster (no TCP/IP or socket overhead),
smaller and much easier to use for embedded products.
One will be able to define at link time if one wants to use the
client/server model or a stand-alone application just by defining which
library to link with.
The mysqld will support all standard MySQL features and
one can use it in a threaded client to run different queries in each
thread.
RAND().
DELETE FROM table_name will return the number of deleted rows. For
fast execution one should use TRUNCATE table_name.
DELETE (cascading DELETE and multi-table
DELETE.
DELETE on MyISAM tables to use the record cache.
To do this, we need to update the threads record cache when we update
the .MYD file.
ORDER BY key_name DESC
queries.
SHOW COLUMNS FROM table_name (used by mysql client to allow
expansions of column names) should not open the table, but only the
definition file. This will require less memory and be much faster.
SET CHARACTER SET we should translate the whole query
at once and not only strings. This will enable users to use the translated
characters in database, table and column names.
gethostbyaddr_r() so that we can change
ip_to_hostname() to not block other threads while doing DNS lookups.
record_in_range() method to MERGE tables to be
able to choose the right index when there is many to choose from. We should
also extend the info interface to get the key distribution for each index,
of analyze is run on all sub tables.
SET SQL_DEFAULT_TABLE_TYPE=[MyISAM | INNODB | BDB | GEMINI | HEAP].
select id from t where grp in (select grp from g where u > 100)
select a.col1, b.col2 from (select max(col1) as col1 from root_table ) a, other_table b where a.col1=b.col1This could be done by automatically creating temporary tables for the derived tables for the duration of the query.
PREPARE of statements and sending of parameters to mysqld.
INSERT ... SELECT to use concurrent inserts.
SELECT MIN(column)
... GROUP BY.
long_query_time with a granularity
in microseconds.
MERGE tables.
myisampack code into the server.
INSERT/DELETE/UPDATE so that we
can gracefully recover if the index file gets full.
ALTER TABLE on a table that is symlinked to another
disk, create temporary tables on this disk.
DATE/DATETIME type that handles time zone information
properly, so that dealing with dates in different time zones is easier.
MyISAM)
without threads.
INSERT SQL_CONCURRENT and mysqld --concurrent-insert to do
a concurrent insert at the end of the file if the file is read-locked.
FOREIGN key definitions in the `.frm' file.
lockd works with modern Linux kernels; If not, we have
to fix lockd!  To test this, start mysqld with
--enable-locking and run the different fork* test suits. They shouldn't
give any errors if lockd works.
LIMIT, like in LIMIT @a,@b.
DEFAULT values to columns.  Give an error when using
an INSERT that doesn't contain a column that doesn't have a
DEFAULT.
SELECT CACHED ...
mysql_query() commands in a row
without reading results or give a nice error message when one does this.
BIT type to take 1 bit (now BIT takes 1 char).
ctime() doesn't work on some FreeBSD systems.
IMAGE option to LOAD DATA INFILE to not update
TIMESTAMP and AUTO_INCREMENT fields.
LOAD DATE INFILE.. UPDATE syntax.
LOAD DATA INFILE ... REPLACE INTO is now.
LOAD DATA INFILE understand syntax like:
LOAD DATA INFILE 'file_name.txt' INTO TABLE tbl_name TEXT_FIELDS (text_field1, text_field2, text_field3) SET table_field1=concatenate(text_field1, text_field2), table_field3=23 IGNORE text_field3 This can be used to skip over extra columns in the text file, or update columns based on expressions of the read data...
LOAD DATA INFILE 'file_name' INTO TABLE 'table_name' ERRORS TO err_table_name
This would cause any errors and warnings to be logged into the err_table_name
table. That table would have a structure like:
line_number - line number in data file error_message - the error/warning message and maybe data_line - the line from the data file
VARCHAR support (There is already support for this in MyISAM).
mysql to netscape.
LOCK DATABASES. (with various options)
DECIMAL and NUMERIC types can't read exponential numbers;
Field_decimal::store(const char *from,uint len) must be recoded
to fix this.
mysql.cc to do fewer malloc() calls when hashing field
names.
t1 JOIN t2 ON ... and t1 JOIN t2 USING ...
Currently, you can only use this syntax with LEFT JOIN.
unsigned long long type.
show status.  Counts for:
INSERT/DELETE/UPDATE statements. Records reads and
updated.  Selects on 1 table and selects with joins.  Mean number of
tables in select. Number of ORDER BY and GROUP BY queries.
mysql in the middle of a query, you should open
another connection and kill the old running query.
Alternatively, an attempt should be made to detect this in the server.
SHOW INFO FROM tbl_name for basic table information
should be implemented.
NATURAL JOIN and UNION JOIN
select a from crash_me left join crash_me2 using (a); In this
case a is assumed to come from the crash_me table.
ON and USING works with the JOIN and
INNER JOIN join types.
CONNECT BY PRIOR ... to search hierarchy structures.
RENAME DATABASE
mysqladmin copy database new-database. -- Requires COPY command to be
added to mysqld
SHOW HOSTS for printing information about the hostname cache.
DELETE and REPLACE options to the UPDATE statement
(this will delete rows when one gets a duplicate key error while updating).
DATETIME to store fractions of seconds.
NULL for calculated columns.
SELECT COUNT(*)*(id+0) FROM table_name GROUP BY id
ALTER TABLE doesn't abort clients that executes
INSERT DELAYED.
UPDATE clause contains the old
values before the update started.
UPDATE statements. For example:
UPDATE TABLE foo SET @a=a+b,a=@a, b=@a+c
myisamchk, REPAIR and OPTIMIZE TABLE should be able
to handle cases where the data and/or index files are symbolic links.
pread()/pwrite() on Windows to enable
concurrent inserts.
SUM(DISTINCT)
ANY(),EVERY() and SOME() group functions. In
ANSI SQL these only works on boolean columns, but we can extend these to
work on any columns/expressions by applying: value == 0 -> FALSE and
value <> 0 -> TRUE.
MAX(column) is the same as the column type.
create table t1 (a DATE); insert into t1 values (now()); create table t2 select max(a) from t1; show columns from t2;
UPDATE the row
if it exists and INSERT a new row if the row didn't exist.
(Like REPLACE works with INSERT / DELETE)
get_changed_tables(timeout,table1,table2,...)
update items,month set
items.price=month.price where items.id=month.id;;
SHOW commands.
SET TIMESTAMP=#;
UNION, MINUS, INTERSECT and FULL OUTER JOIN.
(Currently only LEFT OUTER JOIN is supported)
UNIQUE on fields that can be NULL.
SQL_OPTION MAX_SELECT_TIME=# to put a time limit on a query.
LIMIT to retrieve data from the end.
safe_mysqld: according to FSSTND (which
Debian tries to follow) PID files should go into `/var/run/<progname>.pid'
and log files into `/var/log'. It would be nice if you could put the
"DATADIR" in the first declaration of "pidfile" and "log", so the
placement of these files can be changed with a single statement.
zlib() for gzip-ed files to LOAD DATA INFILE.
BLOB columns (partly solved now).
AUTO_INCREMENT value when one sets a column to 0.
Use NULL instead.
JOIN with parentheses.
GET_LOCK.  When doing this,
one must also handle the possible deadlocks this change will introduce.
Time is given according to amount of work, not real time.
Go to the first, previous, next, last section, table of contents.