# Roadmap

## Highest Priority

- Improve test code coverage
- More fuzz tests
- Test very large databases and LOBs (up to 256 GB)
- Test multi-threaded in-memory db access

## In Version 1.1

- Add version number. Install directory: h2-1.0, jar file: h2-1.0.jar. Micro version: use build number, staring with 1.1.100
- Automatic upgrade if there is a file format change
- Change Constants.DEFAULT_MAX_MEMORY_UNDO to 10000 (and change the docs). Test.
- Enable and document optimizations, LOB files in directories
- Special methods for DataPage.writeByte / writeShort and so on
- Index organized tables CREATE TABLE...(...) ORGANIZATION INDEX (store in data file) (probably file format changes are required for rowId)
- Change the default for NULL || 'x' to NULL

## Priority 1

- Write more tests and documentation for MVCC (Multi Version Concurrency Control)
- RECOVER=1 should automatically recover, =2 should run the recovery tool if required
- More tests with MULTI_THREADED=1
- Test with Spatial DB in a box / JTS (http://docs.codehaus.org/display/GEOS/SpatialDBBox)
- Optimization: result set caching (like MySQL)
- Server side cursors
- Row level locking
- Long running queries / errors / trace system table
- Migrate database tool (also from other database engines)
- Shutdown compact
- Document server mode, embedded mode, web app mode, dual mode (server+embedded)
- Updatable result sets: DatabaseMetaData.ownUpdatesAreVisible = true (for insert, delete, update) Simple solution: automatically calls 'refresh' when the result was changed. Compare with other databases.

## Priority 2

- Automatic mode: jdbc:h2:auto: (embedded mode if possible, if not use server mode). Keep the server running until all have disconnected.
- Support OSGi: http://oscar-osgi.sourceforge.net, http://incubator.apache.org/felix/index.html
- Built-in methods to read/write large objects (BLOB and CLOB): FILE_WRITE('test.txt', 'Hello World'), FILE_READ('test.txt' AS VARCHAR)
- Better space re-use in the files after deleting data (shrink the files)
- Shrink the data file without closing the database (if the end of the file is empty)
- Full outer joins
- Procedural language / script language (Javascript)
- Change LOB mechanism (less files, keep index of lob files, point to files and row, delete unused files earlier, maybe bundle files into a tar file)
- Clustering: recovery needs to becomes fully automatic. Global write lock feature.
- Deferred integrity checking (DEFERRABLE INITIALLY DEFERRED)
- Groovy Stored Procedures (http://groovy.codehaus.org/Groovy+SQL)
- System table / function: cache usage
- Add a migration guide (list differences between databases)
- Optimization: automatic index creation suggestion using the trace file?
- Compression performance: don't allocate buffers, compress / expand in to out buffer
- Connection pool manager
- Implement Statement.cancel for server connections
- Start / stop server with database URL
- Sequence: add features [NO] MINVALUE, MAXVALUE, CYCLE
- Rebuild index functionality (other than delete the index file)
- Don't use deleteOnExit (bug 4513817: File.deleteOnExit consumes memory)
- Console: add accesskey to most important commands (A, AREA, BUTTON, INPUT, LABEL, LEGEND, TEXTAREA)
- Feature: a setting to delete the the log or not (for backup)
- Test with Sun ASPE1_4; JEE Sun AS PE1.4
- Test performance again with SQL Server, Oracle, DB2
- Test with dbmonster (http://dbmonster.kernelpanic.pl/)
- Test with dbcopy (http://dbcopyplugin.sourceforge.net)
- Find a tool to view a text file >100 MB, with find, page up and down (like less)
- Implement, test, document XAConnection and so on
- Web site: meta keywords, description, get rid of frame set
- Pluggable data type (for compression, validation, conversion, encryption)
- CHECK: find out what makes CHECK=TRUE slow, move to CHECK2
- Improve recovery: improve code for log recovery problems (less try/catch)
- Log linear hash index changes, fast open / close
- Index usage for (ID, NAME)=(1, 'Hi'); document
- Suggestion: include jetty as Servlet Container (like LAMP)
- Trace shipping to server
- Performance / server mode: use UDP optionally?
- Version check: docs / web console (using javascript), and maybe in the library (using TCP/IP)
- Web server classloader: override findResource / getResourceFrom
- Cost for embedded temporary view is calculated wrong, if result is constant
- Comparison: pluggable sort order: natural sort
- Count index range query (count(*) where id between 10 and 20)
- Eclipse plugin
- iReport to support H2
- Implement missing JDBC API (CallableStatement,...)
- Compression of the cache
- Run H2 Console inside servlet (pass-through servlet of fix the JSP / app)
- Include SMPT (mail) server (at least client) (alert on cluster failure, low disk space,...)
- Drop with restrict (currently cascade is the default)
- JSON parser and functions
- Option for Java functions: constant/isDeterministic to allow early evaluation when all parameters are constant
- Automatic collection of statistics (auto ANALYZE)
- Server: client ping from time to time (to avoid timeout - is timeout a problem?)
- Copy database: Tool with config GUI and batch mode, extensible (example: compare)
- Document, implement tool for long running transactions using user defined compensation statements
- Support SET TABLE DUAL READONLY
- Linked schema using CSV files: one schema for a directory of files; support indexes for CSV files
- Don't write stack traces for common exceptions like duplicate key to the log by default
- Setting for MAX_QUERY_TIME (default no limit?)
- GCJ: what is the state now?
- Use Janino to convert Java to C++
- Reduce disk space usage (Derby uses less disk space?)
- Events for: Database Startup, Connections, Login attempts, Disconnections, Prepare (after parsing), Web Server (see http://docs.openlinksw.com/virtuoso/fn_dbev_startup.html)
- Optimization: Log compression
- Support standard INFORMATION_SCHEMA tables, as defined in http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt; specially KEY_COLUMN_USAGE (http://dev.mysql.com/doc/refman/5.0/en/information-schema.html, http://www.xcdsql.org/Misc/INFORMATION_SCHEMA%20With%20Rolenames.gif)
- Compatibility: in MySQL, HSQLDB, /0.0 is NULL; in PostgreSQL, Derby: Division by zero
- Functional tables should accept parameters from other tables (see FunctionMultiReturn) SELECT * FROM TEST T, P2C(T.A, T.R)
- Custom class loader to reload functions on demand
- Test http://mysql-je.sourceforge.net/
- Close all files when closing the database (including LOB files that are open on the client side)
- Test Connection Pool http://jakarta.apache.org/commons/dbcp
- Profiler option or profiling tool to find long running and often repeated queries (using DatabaseEventListener API)
- Function to read/write a file from/to LOB
- Allow custom settings (@PATH for RUNSCRIPT for example)
- EXE file: maybe use http://jsmooth.sourceforge.net
- SELECT ... FOR READ WAIT [maxMillisToWait]
- Automatically delete the index file if opening it fails
- Performance: Automatically build in-memory indexes if the whole table is in memory
- H2 Console: The webclient could support more features like phpMyAdmin.
- The HELP information schema can be directly exposed in the Console
- Maybe use the 0x1234 notation for binary fields, see MS SQL Server
- Support Oracle CONNECT BY in some way: http://www.adp-gmbh.ch/ora/sql/connect_by.html, http://philip.greenspun.com/sql/trees.html
- SQL 2003 (http://www.wiscorp.com/sql_2003_standard.zip)
- http://www.jpackage.org
- Version column (number/sequence and timestamp based)
- Optimize getGeneratedKey: send last identity after each execute (server).
- Date: default date is '1970-01-01' (is it 1900-01-01 in the standard / other databases?)
- Test and document UPDATE TEST SET (ID, NAME) = (SELECT ID*10, NAME || '!' FROM TEST T WHERE T.ID=TEST.ID);
- Max memory rows / max undo log size: use block count / row size not row count
- Index summary is only written if log=2; maybe write it also when log=1 and everything is fine (and no in doubt transactions)
- Support 123L syntax as in Java; example: SELECT (2000000000*2)
- Implement point-in-time recovery
- Memory database: add a feature to keep named database open until 'shutdown'
- Use the directory of the first script as the default directory for any scripts run inside that script
- Include the version name in the jar file name
- Optimize ID=? OR ID=?: convert to IN(...)
- LIKE: improved version for larger texts (currently using naive search)
- Auto-reconnect on lost connection to server (even if the server was re-started) except if autocommit was off and there was pending transaction
- The Script tool should work with other databases as well
- Automatically convert to the next 'higher' data type whenever there is an overflow.
- Throw an exception when the application calls getInt on a Long (optional)
- Default date format for input and output (local date constants)
- Cache collation keys for performance
- ValueInt.convertToString and so on (remove Value.convertTo)
- Support custom Collators
- Document ROWNUM usage for reports: SELECT ROWNUM, * FROM (subquery)
- Clustering: Reads should be randomly distributed or to a designated database on RAM
- Clustering: When a database is back alive, automatically synchronize with the master
- Standalone tool to get relevant system properties and add it to the trace output.
- Support mixed clustering mode (one embedded, the other server mode)
- Support 'call proc(1=value)' (PostgreSQL, Oracle)
- HSQLDB compatibility: "INSERT INTO TEST(name) VALUES(?); SELECT IDENTITY()"
- Shutdown lock (shutdown can only start if there are no logins pending, and logins are delayed until shutdown ends)
- Automatically delete the index file if opening it fails
- DbAdapters http://incubator.apache.org/cayenne/
- JAMon (proxy jdbc driver)
- Console: Allow setting Null value; Alternative display format two column (for copy and paste as well)
- Console: Improve editing data (Tab, Shift-Tab, Enter, Up, Down, Shift+Del?)
- Console: Autocomplete Ctrl+Space inserts template
- Google Code http://code.google.com/p/h2database/issues/list#
- Simplify translation ('Donate a translation')
- Option to encrypt .trace.db file
- Write Behind Cache on SATA leads to data corruption See also http://sr5tech.com/write_back_cache_experiments.htm and http://www.jasonbrome.com/blog/archives/2004/04/03/writecache_enabled.html
- Functions with unknown return or parameter data types: serialize / deserialize
- Test if idle TCP connections are closed, and how to disable that
- Try using a factory for Row, Value[] (faster?), http://javolution.org/, alternative ObjectArray / IntArray
- Auto-Update feature for database, .jar file
- ResultSet SimpleResultSet.readFromURL(String url): id varchar, state varchar, released timestamp
- RANK() and DENSE_RANK(), Partition using OVER()
- ROW_NUMBER (not the same as ROWNUM)
- Partial indexing (see PostgreSQL)
- BUILD should fail if ant test fails
- http://rubyforge.org/projects/hypersonic/
- DbVisualizer profile for H2
- Add comparator (x === y) : (x = y or (x is null and y is null))
- Try to create trace file even for read only databases
- Add a sample application that runs the H2 unit test and writes the result to a file (so it can be included in the user app)
- Count on a column that can not be null would be optimized to COUNT(*)
- Table order: ALTER TABLE TEST ORDER BY NAME DESC (MySQL compatibility)
- Backup tool should work with other databases as well
- Console: -ifExists doesn't work for the console. Add a flag to disable other dbs
- Maybe use Fowler Noll Vo hash function
- Improved full text search (supports LOBs, reader / tokenizer / filter).
- Performance: Update in-place
- Check if 'FSUTIL behavior set disablelastaccess 1' improves the performance (fsutil behavior query disablelastaccess)
- Java static code analysis: http://pmd.sourceforge.net/
- Java static code analysis: http://www.eclipse.org/tptp/
- Compatibility for CREATE SCHEMA AUTHORIZATION
- Implement Clob / Blob truncate and the remaining functionality
- Maybe close LOBs after closing connection
- Tree join functionality
- Support alter table add column if table has views defined
- Add multiple columns at the same time with ALTER TABLE .. ADD .. ADD ..
- Support trigger on the tables information_schema.tables and ...columns
- Add H2 to Gem (Ruby install system)
- API for functions / user tables
- Order conditions inside AND / OR to optimize the performance
- Support linked JCR tables
- Make sure H2 is supported by Execute Query: http://executequery.org/
- Read InputStream when executing, as late as possible (maybe only embedded mode). Problem with re-execute.
- Full text search: min word length; store word positions
- FTP Server: Implement a client to send / receive files to server (dir, get, put)
- FTP Server: Implement SFTP / FTPS
- Add an option to the SCRIPT command to generate only portable / standard SQL
- Test Dezign for Databases (http://www.datanamic.com)
- Fast library for parsing / formatting: http://javolution.org/
- Updatable Views (simple cases first)
- Improve create index performance
- Support ARRAY data type
- Implement more JDBC 4.0 features
- H2 Console: implement a servlet to allow simple web app integration
- Support TRANSFORM / PIVOT as in MS Access
- SELECT * FROM (VALUES (...), (...), ....) AS alias(f1, ...)
- Support updatable views with join on primary keys (to extend a table)
- Public interface for functions (not public static)
- Autocomplete: if I type the name of a table that does not exist (should say: syntax not supported)
- Autocomplete: schema support: "Other Grammar","Table Expression","{[schemaName.]tableName | (select)} [[AS] newTableAlias]
- Functions: options readonly, deterministic (pure, always return the same value)
- Document FTP server, including -ftpTask option to execute / kill remote processes
- Add jdbcx to the javadocs
- Delay reading the row if data is not required
- Eliminate undo log records if stored on disk (just one pointer per block, not per record)
- Feature matrix like here: http://www.inetsoftware.de/products/jdbc/mssql/features/default.asp.
- Updatable result set on table without primary key or unique index
- Use LinkedList instead of ArrayList where applicable
- Optimization: (A=B AND B=C) > (A=B AND B=C AND A=C)
- Support % operator (modulo)
- Large subqueries: close them when the main query is closed, not earlier (so result can be reused)
- Support 1+'2'=3, '1'+'2'='12' (MS SQL Server compatibility)
- Support nested transactions
- Add a benchmark for big databases, and one for many users
- Compression in the result set (repeating values in the same column)
- Improve command line consistency (+/- options, or true false options)
- Allow to use the catalog name in statements: [[catalog.]schema.]object
- Support curtimestamp (like curtime, curdate)
- Support ANALYZE {TABLE|INDEX} tableName COMPUTE|ESTIMATE|DELETE STATISTICS ptnOption options
- Support Sequoia (Continuent.org)
- Dynamic length numbers / special methods for DataPage.writeByte / writeShort / Ronni Nielsen
- Pluggable tracing system, ThreadPool, (AvalonDB / deebee / Paul Hammant)
- Recursive Queries (see details)
- Use index on boolean flag (see details)
- Add build for embedded database only
- Release locks (shared or exclusive) on demand
- Support catalog names
- Add object id to metadata tables
- Support OUTER UNION
- Support Parameterized Views (similar to CSVREAD, but using just SQL for the definition)
- Implement a command line SQL utility similar to HenPlus: http://henplus.sourceforge.net
- A way (JDBC driver) to map an URL (jdbc:h2map:c1) to a connection object
- Build script for the embedded functionality only (h2embedded.jar)
- Option for SCRIPT to only process one or a set of tables, and append to a file
- Support using a unique index for IS NULL (including linked tables)
- Support linked tables to the current database
- Support dynamic linked schema (automatically adding/updating/removing tables)
- Compatibility with Derby: VALUES(1), (2); SELECT * FROM (VALUES (1), (2)) AS myTable(c1)
- Compatibility: # is the start of a single line comment (MySQL) but date quote (Access). Mode specific
- Run benchmarks with JDK 1.5, JDK 1.6, java -server
- Optimizations: Faster hash function for strings, byte arrays, big decimal
- DatabaseEventListener: callback for all operations (including expected time, RUNSCRIPT) and cancel functionality
- H2 Console / large result sets: use 'streaming' instead of building the page in-memory
- Benchmark: add a graph to show how databases scale (performance/database size)
- Implement a SQLData interface to map your data over to a custom object
- Extend H2 Console to run tools (show command line as well)
- Make DDL (Data Definition) operations transactional
- Allow execution time prepare for SELECT * FROM CSVREAD(?, 'columnNameString')
- Support multiple directories (on different hard drives) for the same database
- Server protocol: use challenge response authentication, but client sends hash(user+password) encrypted with response
- Support EXEC[UTE] (doesn't return a result set, compatible to MS SQL Server)
- GROUP BY and DISTINCT: support large groups (buffer to disk), do not keep large sets in memory
- Support native XML data type
- Support triggers with a string property or option: SpringTrigger, OSGITrigger
- Clustering: adding a node should be very fast and without interrupting clients (very short lock)
- Support materialized views (using triggers)
- Store dates in local timezone (portability of database files)
- Ability to resize the cache array when resizing the cache
- Automatic conversion from WHERE X>10 AND X>20 to X>20
- Time based cache writing (one second after writing the log)
- Check state of H2 driver for DDLUtils: https://issues.apache.org/jira/browse/DDLUTILS-185
- Index usage for REGEXP LIKE.
- Add a role DBA (like ADMIN).
- Better support multiple processors for in-memory databases.
- Access rights: remember the owner of an object. COMMENT: allow owner of object to change it.
- Implement INSTEAD OF trigger.
- Access rights: Finer grained access control (grant access for specific functions)
- Support N'text'
- Support SCOPE_IDENTITY() to avoid problems when inserting rows in a trigger
- Support DESCRIBE like MySQL or Oracle (DESC|DESCRIBE {[schema.]object[@connect_identifier]})
- Set a connection read only (Connection.setReadOnly)
- In MySQL mode, for AUTO_INCREMENT columns, don't set the primary key
- Use JDK 1.4 file locking to create the lock file (but not yet by default); writing a system property to detect concurrent access from the same VM (different classloaders).
- Read-only sessions (Connection.setReadOnly)
- Support compatibility for jdbc:hsqldb:res:
- In the MySQL and PostgreSQL, use lower case identifiers by default (DatabaseMetaData.storesLowerCaseIdentifiers = true)
- Provide a simple, lightweight O/R mapping tool
- Provide an Java SQL builder with standard and H2 syntax
- Trace: write OS, file system, JVM,... when opening the database
- Trace: write dangerous operations (set log 0,...) in every case (including when opening the database)
- ParameterMetaData should return correct data type where possible (INSERT for example)
- Support indexes for views (probably requires materialized views)
- Linked tables that point to the same database should share the connection
- Document SET SEARCH_PATH, BEGIN, EXECUTE, parameters
- Complete Javadocs for ErrorCode messages and add to docs
- Browser: use Desktop.isDesktopSupported and browse when using JDK 1.6
- Document org.h2.samples.MixedMode
- Server: use one listener (detect if the request comes from an PG or TCP client)
- Store dates as 'local'. Existing files use GMT. Use escape syntax for compatibility.
- Support data type INTERVAL
- NATURAL JOIN: MySQL and PostgreSQL don't repeat columns when using SELECT * ...
- Optimize SELECT MIN(ID), MAX(ID), COUNT(*) FROM TEST WHERE ID BETWEEN 100 AND 200
- Support Oracle functions: TRUNC, NVL2, TO_CHAR, TO_DATE, TO_NUMBER
- Support setQueryTimeout (using System.currentTimeMillis in a loop; not using a thread)
- Sequence: PostgreSQL compatibility (rename, create) (http://www.postgresql.org/docs/8.2/static/sql-altersequence.html)
- DISTINCT: Support large result sets by sorting on all columns (additionally) and then removing duplicates.
- Add replicating file system
- File system that writes to two file systems (for replication)
- File system with a background writer thread; test if this is faster
- FTP access to a database (.csv for a table, a directory for a schema, a file for a lob, a script.sql file).
- LIMIT and OFFSET for GROUP_CONCAT
- Support triggers for INFORMATION_SCHEMA tables (to better support PostgreSQL catalog: rebuild after creating new tables)
- Better document the source code
- Support select * from dual a left join dual b on b.x=(select max(x) from dual)
- Optimization: don't lock when the database is read-only
- Integrate spatial functions from http://geosysin.iict.ch/irstv-trac/wiki/H2spatial/Download
- Support COSH, SINH, and TANH functions
- Native search: support "phrase search", wildcard search (* and ?), case-insensitive search, boolean operators, and grouping
- Improve documentation of access rights
- Support ENUM data type (see MySQL, PostgreSQL, MS SQL Server, maybe others)
- Command line option for the H2 Console and TCP configuration (.h2.server.properties and .h2.keystore)
- Automatically switch the source code to the right platform before compiling
- Support a schema name for Java functions
- Remember the domain of a column
- Support Jackcess (MS Access databases)
- Optimize truncate and drop table (currently all pages are overwritten)

## Not Planned

- HSQLDB (did) support this: select id i from test where i>0 (other databases don't). Supporting it may break compatibility.
- String.intern (so that Strings can be compared with ==) will not be used because some VMs have problems when used extensively.