Class HSQLDialect

  • All Implemented Interfaces:
    ConversionContext

    public class HSQLDialect
    extends Dialect
    An SQL dialect compatible with HSQLDB (HyperSQL).

    Note this version supports HSQLDB version 1.8 and higher, only.

    Enhancements to version 3.5.0 GA to provide basic support for both HSQLDB 1.8.x and 2.x Does not works with Hibernate 3.2 - 3.4 without alteration.

    • Constructor Detail

      • HSQLDialect

        public HSQLDialect()
        Constructs a HSQLDialect
    • Method Detail

      • getAddColumnString

        public java.lang.String getAddColumnString()
        Description copied from class: Dialect
        The syntax used to add a column to a table (optional).
        Overrides:
        getAddColumnString in class Dialect
        Returns:
        The "add column" fragment.
      • supportsLockTimeouts

        public boolean supportsLockTimeouts()
        Description copied from class: Dialect
        Informational metadata about whether this dialect is known to support specifying timeouts for requested lock acquisitions.
        Overrides:
        supportsLockTimeouts in class Dialect
        Returns:
        True is this dialect supports specifying lock timeouts.
      • getForUpdateString

        public java.lang.String getForUpdateString()
        Description copied from class: Dialect
        Get the string to append to SELECT statements to acquire locks for this dialect.
        Overrides:
        getForUpdateString in class Dialect
        Returns:
        The appropriate FOR UPDATE clause string.
      • getLimitHandler

        public LimitHandler getLimitHandler()
        Description copied from class: Dialect
        Returns the delegate managing LIMIT clause.
        Overrides:
        getLimitHandler in class Dialect
        Returns:
        LIMIT clause delegate.
      • supportsLimit

        public boolean supportsLimit()
        Description copied from class: Dialect
        Does this dialect support some form of limiting query results via a SQL clause?
        Overrides:
        supportsLimit in class Dialect
        Returns:
        True if this dialect supports some form of LIMIT.
      • getLimitString

        public java.lang.String getLimitString​(java.lang.String sql,
                                               boolean hasOffset)
        Description copied from class: Dialect
        Apply a limit clause to the query.

        Typically dialects utilize variable limit clauses when they support limits. Thus, when building the select command we do not actually need to know the limit or the offset since we will just be using placeholders.

        Here we do still pass along whether or not an offset was specified so that dialects not supporting offsets can generate proper exceptions. In general, dialects will override one or the other of this method and Dialect.getLimitString(String, int, int).

        Overrides:
        getLimitString in class Dialect
        Parameters:
        sql - The query to which to apply the limit.
        hasOffset - Is the query requesting an offset?
        Returns:
        the modified SQL
      • bindLimitParametersFirst

        public boolean bindLimitParametersFirst()
        Description copied from class: Dialect
        Does the LIMIT clause come at the start of the SELECT statement, rather than at the end?
        Overrides:
        bindLimitParametersFirst in class Dialect
        Returns:
        true if limit parameters should come before other parameters
      • supportsIfExistsAfterTableName

        public boolean supportsIfExistsAfterTableName()
        Description copied from class: Dialect
        For dropping a table, can the phrase "if exists" be applied after the table name?

        NOTE : Only one or the other (or neither) of this and Dialect.supportsIfExistsBeforeTableName() should return true

        Overrides:
        supportsIfExistsAfterTableName in class Dialect
        Returns:
        true if the "if exists" can be applied after the table name
      • supportsIfExistsBeforeTableName

        public boolean supportsIfExistsBeforeTableName()
        Description copied from class: Dialect
        For dropping a table, can the phrase "if exists" be applied before the table name?

        NOTE : Only one or the other (or neither) of this and Dialect.supportsIfExistsAfterTableName() should return true

        Overrides:
        supportsIfExistsBeforeTableName in class Dialect
        Returns:
        true if the "if exists" can be applied before the table name
      • supportsColumnCheck

        public boolean supportsColumnCheck()
        Description copied from class: Dialect
        Does this dialect support column-level check constraints?
        Overrides:
        supportsColumnCheck in class Dialect
        Returns:
        True if column-level CHECK constraints are supported; false otherwise.
      • supportsSequences

        public boolean supportsSequences()
        Description copied from class: Dialect
        Does this dialect support sequences?
        Overrides:
        supportsSequences in class Dialect
        Returns:
        True if sequences supported; false otherwise.
      • getCreateSequenceString

        protected java.lang.String getCreateSequenceString​(java.lang.String sequenceName)
        HSQL will start with 0, by default. In order for Hibernate to know that this not transient, manually start with 1.
        Overrides:
        getCreateSequenceString in class Dialect
        Parameters:
        sequenceName - The name of the sequence
        Returns:
        The sequence creation command
      • getCreateSequenceString

        protected java.lang.String getCreateSequenceString​(java.lang.String sequenceName,
                                                           int initialValue,
                                                           int incrementSize)
                                                    throws MappingException
        Because of the overridden getCreateSequenceString(String), we must also override getCreateSequenceString(String, int, int) to prevent 2 instances of "start with".
        Overrides:
        getCreateSequenceString in class Dialect
        Parameters:
        sequenceName - The name of the sequence
        initialValue - The initial value to apply to 'create sequence' statement
        incrementSize - The increment value to apply to 'create sequence' statement
        Returns:
        The sequence creation command
        Throws:
        MappingException - If sequences are not supported.
      • getDropSequenceString

        protected java.lang.String getDropSequenceString​(java.lang.String sequenceName)
        Description copied from class: Dialect
        Typically dialects which support sequences can drop a sequence with a single command. This is convenience form of Dialect.getDropSequenceStrings(java.lang.String) to help facilitate that.

        Dialects which support sequences and can drop a sequence in a single command need *only* override this method. Dialects which support sequences but require multiple commands to drop a sequence should instead override Dialect.getDropSequenceStrings(java.lang.String).

        Overrides:
        getDropSequenceString in class Dialect
        Parameters:
        sequenceName - The name of the sequence
        Returns:
        The sequence drop commands
      • getSelectSequenceNextValString

        public java.lang.String getSelectSequenceNextValString​(java.lang.String sequenceName)
        Description copied from class: Dialect
        Generate the select expression fragment that will retrieve the next value of a sequence as part of another (typically DML) statement.

        This differs from Dialect.getSequenceNextValString(String) in that this should return an expression usable within another statement.

        Overrides:
        getSelectSequenceNextValString in class Dialect
        Parameters:
        sequenceName - the name of the sequence
        Returns:
        The "nextval" fragment.
      • getSequenceNextValString

        public java.lang.String getSequenceNextValString​(java.lang.String sequenceName)
        Description copied from class: Dialect
        Generate the appropriate select statement to to retrieve the next value of a sequence.

        This should be a "stand alone" select statement.

        Overrides:
        getSequenceNextValString in class Dialect
        Parameters:
        sequenceName - the name of the sequence
        Returns:
        String The "nextval" select string.
      • getQuerySequencesString

        public java.lang.String getQuerySequencesString()
        Description copied from class: Dialect
        Get the select command used retrieve the names of all sequences.
        Overrides:
        getQuerySequencesString in class Dialect
        Returns:
        The select command; or null if sequences are not supported.
        See Also:
        SchemaUpdate
      • getSelectClauseNullString

        public java.lang.String getSelectClauseNullString​(int sqlType)
        Description copied from class: Dialect
        Given a Types type code, determine an appropriate null value to use in a select clause.

        One thing to consider here is that certain databases might require proper casting for the nulls here since the select here will be part of a UNION/UNION ALL.

        Overrides:
        getSelectClauseNullString in class Dialect
        Parameters:
        sqlType - The Types type code.
        Returns:
        The appropriate select clause value fragment.
      • supportsUnionAll

        public boolean supportsUnionAll()
        Description copied from class: Dialect
        Does this dialect support UNION ALL, which is generally a faster variant of UNION?
        Overrides:
        supportsUnionAll in class Dialect
        Returns:
        True if UNION ALL is supported; false otherwise.
      • supportsCurrentTimestampSelection

        public boolean supportsCurrentTimestampSelection()
        HSQLDB 1.8.x requires CALL CURRENT_TIMESTAMP but this should not be treated as a callable statement. It is equivalent to "select current_timestamp from dual" in some databases. HSQLDB 2.0 also supports VALUES CURRENT_TIMESTAMP

        Does this dialect support a way to retrieve the database's current timestamp value?

        Overrides:
        supportsCurrentTimestampSelection in class Dialect
        Returns:
        True if the current timestamp can be retrieved; false otherwise.
      • getCurrentTimestampSelectString

        public java.lang.String getCurrentTimestampSelectString()
        Description copied from class: Dialect
        Retrieve the command used to retrieve the current timestamp from the database.
        Overrides:
        getCurrentTimestampSelectString in class Dialect
        Returns:
        The command.
      • getCurrentTimestampSQLFunctionName

        public java.lang.String getCurrentTimestampSQLFunctionName()
        Description copied from class: Dialect
        The name of the database-specific SQL function for retrieving the current timestamp.
        Overrides:
        getCurrentTimestampSQLFunctionName in class Dialect
        Returns:
        The function name.
      • getLockingStrategy

        public LockingStrategy getLockingStrategy​(Lockable lockable,
                                                  LockMode lockMode)
        For HSQLDB 2.0, this is a copy of the base class implementation. For HSQLDB 1.8, only READ_UNCOMMITTED is supported.

        Get a strategy instance which knows how to acquire a database-level lock of the specified mode for this dialect.

        Overrides:
        getLockingStrategy in class Dialect
        Parameters:
        lockable - The persister for the entity to be locked.
        lockMode - The type of lock to be acquired.
        Returns:
        The appropriate locking strategy.
      • supportsCommentOn

        public boolean supportsCommentOn()
        Description copied from class: Dialect
        Does this dialect/database support commenting on tables, columns, etc?
        Overrides:
        supportsCommentOn in class Dialect
        Returns:
        true if commenting is supported
      • supportsEmptyInList

        public boolean supportsEmptyInList()
        Description copied from class: Dialect
        Does this dialect support empty IN lists?

        For example, is [where XYZ in ()] a supported construct?

        Overrides:
        supportsEmptyInList in class Dialect
        Returns:
        True if empty in lists are supported; false otherwise.
      • requiresCastingOfParametersInSelectClause

        public boolean requiresCastingOfParametersInSelectClause()
        Description copied from class: Dialect
        Does this dialect require that parameters appearing in the SELECT clause be wrapped in cast() calls to tell the db parser the expected type.
        Overrides:
        requiresCastingOfParametersInSelectClause in class Dialect
        Returns:
        True if select clause parameter must be cast()ed
      • doesReadCommittedCauseWritersToBlockReaders

        public boolean doesReadCommittedCauseWritersToBlockReaders()
        Description copied from class: Dialect
        For the underlying database, is READ_COMMITTED isolation implemented by forcing readers to wait for write locks to be released?
        Overrides:
        doesReadCommittedCauseWritersToBlockReaders in class Dialect
        Returns:
        True if writers block readers to achieve READ_COMMITTED; false otherwise.
      • doesRepeatableReadCauseReadersToBlockWriters

        public boolean doesRepeatableReadCauseReadersToBlockWriters()
        Description copied from class: Dialect
        For the underlying database, is REPEATABLE_READ isolation implemented by forcing writers to wait for read locks to be released?
        Overrides:
        doesRepeatableReadCauseReadersToBlockWriters in class Dialect
        Returns:
        True if readers block writers to achieve REPEATABLE_READ; false otherwise.
      • supportsLobValueChangePropogation

        public boolean supportsLobValueChangePropogation()
        Description copied from class: Dialect
        Does the dialect support propagating changes to LOB values back to the database? Talking about mutating the internal value of the locator as opposed to supplying a new locator instance...

        For BLOBs, the internal value might be changed by: Blob.setBinaryStream(long), Blob.setBytes(long, byte[]), Blob.setBytes(long, byte[], int, int), or Blob.truncate(long).

        For CLOBs, the internal value might be changed by: Clob.setAsciiStream(long), Clob.setCharacterStream(long), Clob.setString(long, String), Clob.setString(long, String, int, int), or Clob.truncate(long).

        NOTE : I do not know the correct answer currently for databases which (1) are not part of the cruise control process or (2) do not Dialect.supportsExpectedLobUsagePattern().

        Overrides:
        supportsLobValueChangePropogation in class Dialect
        Returns:
        True if the changes are propagated back to the database; false otherwise.
      • toBooleanValueString

        public java.lang.String toBooleanValueString​(boolean bool)
        Description copied from class: Dialect
        The SQL literal value to which this database maps boolean values.
        Overrides:
        toBooleanValueString in class Dialect
        Parameters:
        bool - The boolean value
        Returns:
        The appropriate SQL literal.
      • supportsTupleDistinctCounts

        public boolean supportsTupleDistinctCounts()
        Description copied from class: Dialect
        Does this dialect support `count(distinct a,b)`?
        Overrides:
        supportsTupleDistinctCounts in class Dialect
        Returns:
        True if the database supports counting distinct tuples; false otherwise.
      • supportsNamedParameters

        public boolean supportsNamedParameters​(java.sql.DatabaseMetaData databaseMetaData)
                                        throws java.sql.SQLException
        Description copied from class: Dialect
        Override the DatabaseMetaData#supportsNamedParameters()
        Overrides:
        supportsNamedParameters in class Dialect
        Returns:
        boolean
        Throws:
        java.sql.SQLException - Accessing the DatabaseMetaData can throw it. Just re-throw and Hibernate will handle.
      • dropConstraints

        public boolean dropConstraints()
        Description copied from class: Dialect
        Do we need to drop constraints before dropping tables in this dialect?
        Overrides:
        dropConstraints in class Dialect
        Returns:
        True if constraints must be dropped prior to dropping the table; false otherwise.
      • getCascadeConstraintsString

        public java.lang.String getCascadeConstraintsString()
        Description copied from class: Dialect
        Completely optional cascading drop clause
        Overrides:
        getCascadeConstraintsString in class Dialect
        Returns:
        String