# 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 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) ParameterMetaData should return correct data type where possible (INSERT, UPDATE; supported by PostgreSQL, Derby, HSQLDB) 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 in i-net software. 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) 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) Built-in methods to write large objects (BLOB and CLOB): FILE_WRITE('test.txt', 'Hello World') Change package name in version 2.0: org.h2database MVCC: support transactionally consistent backups using SCRIPT Improve time to open large databases (see mail 'init time for distributed setup') Use ARRAY for fulltext search return value, at least internally in the native implementation (and as an option for the user) Move Maven 2 repository from hsql.sf.net to h2database.sf.net Java 1.5 tool: JdbcUtils.closeSilently(s1, s2,...) Document how to use IKVM Javadoc: document design patterns used Update Wikipedia Try https://hudson.dev.java.net/ Don't create @~ of not translated Triggers for metadata tables; use for PostgreSQL catalog Does the FTP server has problems with multithreading? Write an article about SQLInjection (h2\src\docsrc\html\images\SQLInjection.txt) Convert SQL-injection-2.txt to html document, include SQLInjection.java sample Send SQL Injection solution proposal to PostgreSQL, MySQL, Derby, HSQLDB,... Improve LOB in directories performance Web site design: http://www.igniterealtime.org/projects/openfire/index.jsp HSQLDB compatibility: Openfire server uses: CREATE SCHEMA PUBLIC AUTHORIZATION DBA; CREATE USER SA PASSWORD ""; GRANT DBA TO SA; SET SCHEMA PUBLIC Web site: Rename Performance to Comparison [/Compatibility], move Comparison to Other Database Engines to Comparison, move Products that Work with H2 to Comparison, move Performance Tuning to Advanced Topics Translation: use ${.} in help.csv Translated .pdf Cluster: hot deploy (adding a node on runtime) Test with PostgreSQL Version 8.2 Submit again to http://www.docjar.com/ Website: Don't use frames. Try again with Lobo browser (pure Java) Recovery tool: bad blocks should be converted to INSERT INTO SYSTEM_ERRORS(...), and things should go into the .trace.db file RECOVER=2 to backup the database, run recovery, open the database Recovery should work with encrypted databases Integrate tools in H2 Console Corruption: new error code, add help Space reuse: after init, scan all storages and free those that don't belong to a live database object SysProperties: change everything to H2_... Use FilterIn / FilterOut putStream? Access rights: add missing features (users should be 'owner' of objects; missing rights for sequences; dropping objects) Support NOCACHE table option (Oracle) Use ant 'get' to download dependencies Index usage for UPDATE ... WHERE .. IN (SELECT...) The RunScript tool should support interactive mode (reading from system in). Password using a second thread. ## 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.