H2 database logo   ▲

Home
Download
Cheat Sheet

Documentation
Quickstart
Installation
Tutorial
Features
Security
Performance
Advanced

Reference
Commands
Functions
• Aggregate • Window

Data Types
SQL Grammar
System Tables
Javadoc
PDF (2 MB)

Support
FAQ
Error Analyzer
Google Group

Appendix
History
License
Build
Links
MVStore
Architecture
Migration to 2.0

 

Change Log

Next Version (unreleased)

  • Nothing yet

Version 2.2.224 (2023-09-17)

  • Issue #3883 Performance regression in 2.2.222

Version 2.2.222 (2023-08-22)

  • Fixed race condition in MVStore causing database corruption "File corrupted in chunk ###"
  • Issue #3868: INFORMATION_SCHEMA.SESSIONS.ISOLATION_LEVEL returns isolation level of the current session in all rows
  • PR #3865: Add possibility to enable virtual worker threads in TCP, Web, and PG servers on Java 21+
  • PR #3864: Improve performance of TCP client driver when it is used from virtual threads
  • Issue #2665: Parser shouldn't suggest compatibility syntax elements on parsing error
  • Issue #3089: GREATEST and LEAST aren't fully compliant with the SQL Standard
  • PR #3861: Improve SET EXCLUSIVE 2 and use stable time source for timeout exceptions
  • PR #3859: Fix conversion of PK columns to identity columns
  • Issue #3855: StackOverflowError when using TRACE_LEVEL_SYSTEM_OUT=4
  • PR #3854: Fix issues with newer JVMs
  • PR #3851: Remove lift configuration
  • PR #3847: Fix the NullPointerException caused by accessing 'user' after the session has been closed
  • PR #3846: Make DB_CLOSE_ON_EXIT safer
  • PR #3842: Adds support of quotedNulls in CSV handling

Version 2.2.220 (2023-07-04)

  • PR #3834: Increase database format version
  • PR #3833: Disallow plain webAdminPassword values to force usage of hashes
  • PR #3831: Add Oracle-style NOWAIT, WAIT n, and SKIP LOCKED to FOR UPDATE clause
  • PR #3830: Fix time zone of time/timestamp with time zone AT LOCAL
  • PR #3822 / Issue #2671: Add quantified comparison predicates with array
  • PR #3820: Add partial implementation of JSON simplified accessor
  • PR #3818: Add support of underscores in numeric literals
  • PR #3817: Add ANY_VALUE() aggregate function
  • PR #3814: Fix regression in comparisons with infinities and NaNs
  • Issue #3040: System objectIds are recycled twice when CTE queries are executed.
  • PR #3812: UNIQUE null treatment
  • PR #3811: BTRIM function, octal and binary literals and other changes
  • Issue #352: In comparison text values are converted to INT even when they should be converted to BIGINT
  • PR #3797: MSSQL mode: Discard table hints on plain UPDATE statements
  • PR #3791: Formatted cast of datetimes to/from character strings
  • Issue #3785: CSVRead: Fails to translate empty Numbers, when cells are quoted
  • Issue #3762: Comparison predicates with row values don't create index conditions
  • PR #3761: LAST_DAY function and other changes
  • Issue #3705: Oracle DATE type: milliseconds (second fractions) rounded in H2 but truncated in Oracle (fixed in SYSDATE only)
  • Issue #3642: AssertionError in mvstore.FileStore.serializeAndStore
  • Issue #3675: H2 2.x cannot read PostgreSQL-style sequence generator start with option without WITH keyword
  • Issue #3757: FORMATDATETIME function doesn't handle time with time zone properly
  • PR #3756: Limit the row list allocation based on the row count
  • PR #3753: Add missing NEWSEQUENTIALID function in MSSQLServer mode
  • Issue #3730: FILE_READ from JAR filesystem on classpath results in file of length 0
  • PR #3749: Fix min/max description for sequences
  • PR #3739: Fix count(*) for linked table to Oracle
  • Issue #3731: Division result exceeds numeric precision constraint
  • PR #3718: Add test coverage for JDK 17
  • Issue #3580: TestCrashAPI: NPE in ParserUtil.getTokenType() (called by Parser.readIfDataType1())
  • PR #3709: Update copyright years and fix building of documentation
  • Issue #3701: CLOBs can cause ClassCastExceptions
  • Issue #3698: MySQL mode show columns from table, if modificationMetaId changed between prepared and execute. Then error occurred.
  • PR #3699: Upgrade to the latest OSGi JDBC specification
  • Issue #3659: User-defined variable "sticky" if used in view with join
  • Issue #3693: Wrong result when intersecting unnested arrays
  • PR #3691: GitHub Workflows security hardening
  • PR #3688: Construct FormatTokenEnum.TOKENS during class initialization
  • Issue #3682: MVStoreException at accountForRemovedPage
  • Issue #3664: [2.1.214] NullPointerException in org.h2.command.query.Select.queryDistinct
  • PR #3650: fix version number in the archives html table
  • PR #3649: Basic implementation of materialized view
  • Issue #3646: org.h2.mvstore.MVStoreException: Chunk metadata too long
  • Issue #3645: The BITCOUNT function incorrectly counts BINARY/VARBINARY values of >=16 bytes.
  • Issue #3637: DB content massacred when opening a 2.1.214 DB with current master
  • Issue #3636: "This store is closed" after two-phase commit
  • PR #3639: Add random_uuid() alias to be compatible with postgres
  • Issue #3640: SOUNDEX function should not be case-sensitive
  • Issue #3633: Memory leak in case of in-memory database
  • PR #3629 Better separation between MVStore and FileStore
  • PR #3626: Improve memory estimation of CacheLongKeyLIRS and correct some passed memory sizes
  • Issue #3619: PostgreSQL mode: STRING_AGG with prepared statement parameter not working
  • Issue #3615: H2 Console connecting to Oracle DB will not show the list of tables
  • PR #3613: Fix infinite loop in Tokenizer when special whitespace character is used
  • Issue #3606: Support for GraalVMs native-image
  • Issue #3607: [MySQL] UNIX_TIMESTAMP should return NULL
  • Issue #3604: Improper FROM_1X implementation corrupts some BLOBs during migration
  • Issue #3597: Support array element assignments in UPDATE statements
  • Issue #3599: [2.1.214][MariaDB] DELETE query failure
  • Issue #3600: NPE in MVTable.lock(), version 2.1.214
  • Issue #3601: InvalidPathException when saving lock file
  • Issue #3583: lob cleaner issue
  • Issue #3585: Misuse ValueReal.DECIMAL_PRECISION when optimize typeinfo from DOUBLE to DECFLOAT
  • Issue #3575: Possible syntax mismatch for json_object in MySQL compatibility mode
  • PR #3577: Add support of TINYINT and DECFLOAT to TO_CHAR
  • Issue #3567: No AUTO_INCREMENT in DatabaseMetaData.getTypeInfo()
  • PR #3555: Add missing check for -webExternalNames flag
  • Issue #3543: PostgreSQL mode, update with "from", why "NULL not allowed" error?
  • PR #3542: Fix failed to delete a readonly file on Windows file systems

Version 2.1.214 (2022-06-13)

  • Issue #3538: In Postgres compatibility mode the NUMERIC type w/o scale should not default to 0
  • Issue #3534: Subquery has incorrect empty parameters since 2.1.210 that breaks sameResultAsLast()
  • Issue #3390: "ROW" cannot be set as a non keyword in 2.x
  • Issue #3448: With linked table to postgreSQL, case-sensitive column names not respected in where part
  • Issue #3434: JavaTableFunction is not closing underlying ResultSet when reading column list
  • Issue #3468: Invalid DB format exception (for 1.x DB in 2.x h2) should have a specific SQLException vendorCode
  • Issue #3528: Weird syntax error with HAVING clause in Oracle Mode
  • Issue #3307: Fix SHUTDOWN DEFRAG for encrypted databases
  • Issue #3515: Support for NEXTVAL property in DB2 mode
  • Issue #3444: Conversion 'text' to 'integer' doesn't work anymore
  • Issue #3493: org.h2.tools.DeleteDbFiles won't delete files under certain circumstances
  • Issue #3486: FilePathDisk.newDirectoryStream() may fail on remote drive on Windows due to AccessDeniedException in Path.toRealPath()
  • Issue #3484: LOB issue

Version 2.1.212 (2022-04-09)

  • Issue #3512: BITNOT(BIT_NAND_AGG(...) OVER ()) produces wrong result
  • Issue #3510: PreparedStatement execution with java.io.tmpdir pointing to a directory symlink results in FileAlreadyExistsException
  • PR #3504: Fix TypeInfo.getHigherGeometry() for types with and without SRID
  • PR #3481: Add support for standard interval literals with precision
  • Issue #3471: Possibility of corruption after SHUTDOWN DEFRAG
  • Issue #3473: DROP TABLE/INDEX causes memory leak
  • PR #3464 / Issue #3457: increase max length of VAR* types
  • PR #3460: fix bug in readStoreHeader()
  • PR #3458: Add performance tests for SQLite
  • Issue #1808: Occasional NPE in concurrent update of LOB
  • Issue #3439: Cannot use enum values in JSON without explicit casts
  • Issue #3426: Regression: BIT(1) is not accepted in MySQL compatibility mode
  • PR #3422: Allow combination of any geometry types with the same SRID
  • Issue #3414: H2 2.1.210: Query with Parameters throws NPE
  • Issue #3413: Parser can't parse REFERENCES … NOT NULL
  • Issue #3410: OOME with nested derived tables
  • Issue #3405: Enhance SCRIPT to support operations on STDOUT
  • Issue #3406 / PR #3407: FunctionMultiReturn.polar2CartesianArray result set iteration throws ClassCastException
  • Issue #3400: Regression: ORDER BY ROWNUM fails with General error: "Unexpected code path"
  • Issue #3387: SYSDATE behavior changed in 2.x
  • Issue #3394: SYSDATE Considered Identifier when used in inner select
  • Issue #3391: Hang on merge statement with data change delta table
  • PR #3384: Remove abandoned Java to C converter and fix some warnings from Sonatype Lift
  • PR #3382: Use secure parser in H2AuthConfigXml to avoid future reports

Version 2.1.210 (2022-01-17)

  • PR #3381: Add IDENTITY() and SCOPE_IDENTITY() to LEGACY mode
  • Issue #3376: Data cannot be read after insert of clob data > MAX_LENGTH_INPLACE_LOB with data change delta table
  • PR #3377: Add -webExternalNames setting and fix WebServer.getConnection()
  • PR #3367: Use faster checks of dimension systems of geometries
  • PR #3369: Added v2 changes in migration docs
  • Issue #3361: MemoryEstimator.estimateMemory() can return negative size
  • PR #3362: Use BufferedReader instead of BufferedInputStream to avoid Illegal seek exception
  • Issue #3353: Wrong rownum() scope for DML with change delta table
  • PR #3352: make Javadoc happier
  • Issue #3344: Changelog could link to github issue
  • Issue #3340: JDBC index type seems wrong
  • Issue #3336: FT_INIT error when mode=MySQL
  • Issue #3334: Regression with CREATE ALIAS - Parameter "#2" is not set
  • Issue #3321: Insert Primary Key after import CSV Data does not work
  • PR #3323: Tokenize SQL before parsing and preserve tokens for recompilation
  • PR #3320: Add Servlet 5-compatible servlet for H2 Console
  • Issue #918: Parser fails recognising set operations in correlated subqueries
  • Issue #2050: PostgreSQL with recursive fail with union in the final query
  • PR #3316: Update copyright years
  • PR #3315: Never put read locks into lockSharedSessions and other minor changes
  • Issue #492: H2 does not correctly parse <parenthesized joined table>
  • Issue #3311: Parser creates wrong join graph in some cases and uses wrong tables for column mapping
  • FORCE_JOIN_ORDER setting is removed
  • Issue #1983: Official build script is not compatible with Java 13
  • PR #3305: Add UNIQUE(VALUE) and remove some non-standard keywords
  • PR #3299: Remove useless StringBuilder.toString() call
  • PR #3298: Delete unused sqlTypes array

Version 2.0.206 (2022-01-04)

  • Issue #3322: Create linked table fails when the table contains a Geometry with a data type specified
  • Issue #3297: Unexpected GROUP BY results with indexed IGNORECASE column

Version 2.0.204 (2021-12-21)

  • Issue #3291: Add Legacy and Strict modes
  • Issue #3287: SELECT statement works on 1.4.200 but fails on 2.0.202 with "Column XYZ must be in the GROUP BY list"
  • PR #3284: Remove unused UNDO_LOG setting
  • Issue #3251: Table with GEOMETRY column can't have a TriggerAdapter-based trigger any more
  • PR #3281: DateTimeFormatter-based FORMATDATETIME and PARSEDATETIME and other changes
  • Issue #3246: Spatial predicates with comparison are broken in MySQL compatibility mode
  • Issue #3270: org.h2.jdbc.JdbcSQLFeatureNotSupportedException: Feature not supported: "Unsafe comparison or cast"
  • Issue #3268 / PR #3275: Add TO_DATE and TO_TIMESTAMP to PostgreSQL compatibility mode
  • PR #3274: Remove some dead code and unused params
  • Issue #3266: Oracle compatibility NUMBER without precision and scale should have variable scale
  • Issue #3263: Unable to store BigDecimal with negative scale in NUMERIC(19,6) column
  • PR #3261: Small optimization for MIN and MAX
  • Issue #3258 / PR #3259: Prevent incorrect optimization of COUNT(*) and other changes
  • PR #3255: Throw proper exception when type of argument isn't known
  • Issue #3249: Multi-column assignment with subquery throws exception when subquery doesn't return any rows
  • PR #3248: Remove redundant uniqueness check, correct version in pom
  • PR #3247: Avoid AIOBE exception in TestCrashAPI and in Transaction
  • Issue #3241: ResultSetMetaData::getColumnTypeName should produce the correct ARRAY type
  • Issue #3204: H2 Tools Web Console: Unicode 32
  • Issue #3227: Regression when referencing outer joined column from correlated subquery
  • Issue #3237: Can no longer cast CHAR(n) to BOOLEAN with n > 1
  • Issue #3235: Regression in IN predicate with empty in list
  • Issue #3236: NullPointerException in DatabaseMetaData::getIndexInfo when querying the info for views
  • Issue #3233: General error when using NULL predicate on _ROWID_ column
  • Issue #3223: TRUNC(v, p) with negative precisions no longer works
  • Issue #3221: NullPointerException when creating domain
  • Issue #3186: ResultSetMetaData.getSchemaName() returns empty string for aliased columns