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).
.frmfiles) This will enable us to not run out of bits when adding more table options. One will still be able to use the old
.frmfile 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
mysqldas 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
mysqldwill support all standard MySQL features and one can use it in a threaded client to run different queries in each thread.
DELETE FROM table_namewill return the number of deleted rows. For fast execution one should use
MyISAMtables to use the record cache. To do this, we need to update the threads record cache when we update the
ORDER BY key_name DESCqueries.
SHOW COLUMNS FROM table_name(used by
mysqlclient 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 SETwe 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.
MERGEtables 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
analyzeis 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.
PREPAREof statements and sending of parameters to
INSERT ... SELECTto use concurrent inserts.
SELECT MIN(column) ... GROUP BY.
long_query_timewith a granularity in microseconds.
myisampackcode into the server.
INSERT/DELETE/UPDATEso that we can gracefully recover if the index file gets full.
ALTER TABLEon a table that is symlinked to another disk, create temporary tables on this disk.
DATE/DATETIMEtype that handles time zone information properly, so that dealing with dates in different time zones is easier.
MyISAM) without threads.
mysqld --concurrent-insertto do a concurrent insert at the end of the file if the file is read-locked.
FOREIGNkey definitions in the `.frm' file.
lockdworks with modern Linux kernels; If not, we have to fix
lockd! To test this, start
--enable-lockingand run the different fork* test suits. They shouldn't give any errors if
LIMIT, like in
DEFAULTvalues to columns. Give an error when using an
INSERTthat doesn't contain a column that doesn't have a
SELECT CACHED ...
mysql_query()commands in a row without reading results or give a nice error message when one does this.
BITtype to take 1 bit (now
BITtakes 1 char).
ctime()doesn't work on some FreeBSD systems.
LOAD DATA INFILEto not update
LOAD DATE INFILE.. UPDATEsyntax.
LOAD DATA INFILE ... REPLACE INTOis now.
LOAD DATA INFILEunderstand 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_nameThis 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
VARCHARsupport (There is already support for this in MyISAM).
LOCK DATABASES. (with various options)
NUMERICtypes can't read exponential numbers;
Field_decimal::store(const char *from,uint len)must be recoded to fix this.
mysql.ccto 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
unsigned long longtype.
show status. Counts for:
UPDATEstatements. Records reads and updated. Selects on 1 table and selects with joins. Mean number of tables in select. Number of
mysqlin 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_namefor basic table information should be implemented.
select a from crash_me left join crash_me2 using (a); In this case a is assumed to come from the crash_me table.
USINGworks with the
INNER JOINjoin types.
CONNECT BY PRIOR ...to search hierarchy structures.
mysqladmin copy database new-database. -- Requires COPY command to be added to
SHOW HOSTSfor printing information about the hostname cache.
REPLACEoptions to the
UPDATEstatement (this will delete rows when one gets a duplicate key error while updating).
DATETIMEto store fractions of seconds.
NULLfor calculated columns.
SELECT COUNT(*)*(id+0) FROM table_name GROUP BY id
ALTER TABLEdoesn't abort clients that executes
UPDATEclause contains the old values before the update started.
UPDATEstatements. For example:
UPDATE TABLE foo SET @a=a+b,a=@a, b=@a+c
OPTIMIZE TABLEshould be able to handle cases where the data and/or index files are symbolic links.
pwrite()on Windows to enable concurrent inserts.
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;
UPDATEthe row if it exists and
INSERTa new row if the row didn't exist. (Like
update items,month set items.price=month.price where items.id=month.id;;
FULL OUTER JOIN. (Currently only
LEFT OUTER JOINis supported)
UNIQUEon fields that can be
SQL_OPTION MAX_SELECT_TIME=#to put a time limit on a query.
LIMITto 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.
gzip-ed files to
LOAD DATA INFILE.
BLOBcolumns (partly solved now).
AUTO_INCREMENTvalue when one sets a column to 0. Use
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.