Class DialectH2
- java.lang.Object
-
- org.nuxeo.ecm.core.storage.sql.jdbc.dialect.Dialect
-
- org.nuxeo.ecm.core.storage.sql.jdbc.dialect.DialectH2
-
public class DialectH2 extends Dialect
H2-specific dialect.- Author:
- Florent Guillaume
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class org.nuxeo.ecm.core.storage.sql.jdbc.dialect.Dialect
Dialect.ArraySubQuery, Dialect.DialectIdType, Dialect.FulltextMatchInfo, Dialect.JDBCInfo
-
-
Field Summary
Fields Modifier and Type Field Description protected static String
DEFAULT_USERS_SEPARATOR
protected boolean
disableReadVersionPermission
protected boolean
disableVersionACL
protected static List<String>
RESERVED_KEYWORDS
protected String
usersSeparator
-
Fields inherited from class org.nuxeo.ecm.core.storage.sql.jdbc.dialect.Dialect
aclOptimizationsEnabled, ARRAY_SEP, clusteringEnabled, DEBUG_REAL_UUIDS, DEBUG_UUIDS, descending, DIALECT_CLASS, DIALECTS, fulltextDisabled, fulltextSearchDisabled, HEX_DIGITS, NULLS_LAST_ON_DESC_PROP, proxiesEnabled, readAclMaxSize, softDeleteEnabled, storesUpperCaseIdentifiers
-
-
Constructor Summary
Constructors Constructor Description DialectH2(DatabaseMetaData metadata, RepositoryDescriptor repositoryDescriptor)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description String
addPagingClause(String sql, long limit, long offset)
Returns the SQL query with a paging clauseList<String>
checkStoredProcedure(String procName, String procCreate, String ddlMode, Connection connection, JDBCLogger logger, Map<String,Serializable> properties)
Checks if a given stored procedure exists and is identical to the passed creation SQL.boolean
doesUpdateFromRepeatSelf()
When doing an UPDATE t SET ...String
getAncestorsIdsSql()
Gets the SQL query to get the ancestors of a set of ids.String
getBlobLengthFunction()
Gets the SQL function that returns the length of a blob, in bytes.String
getClobCast(boolean inOrderBy)
When using a CLOB field in an expression, is some casting required and with what pattern?String
getClusterGetInvalidations()
Gets the SQL to query invalidations for this cluster node.String
getClusterInsertInvalidations()
Gets the SQL to send an invalidation to the cluster.String
getCreateFulltextIndexSql(String indexName, String quotedIndexName, Table table, List<Column> columns, Model model)
Gets a CREATE INDEX statement for a fulltext index.String
getDialectFulltextQuery(String query)
Get the dialect-specific version of a fulltext query.Serializable
getFromResultSet(ResultSet rs, int index, Column column)
int
getFulltextIndexedColumns()
Specifies what columns of the fulltext table have to be indexed.Dialect.FulltextMatchInfo
getFulltextScoredMatchInfo(String fulltextQuery, String indexName, int nthMatch, Column mainColumn, Model model, Database database)
Gets the SQL information needed to do a a fulltext match, either with a direct expression in the WHERE clause, or using a join with an additional table.String
getInTreeSql(String idColumnName, String id)
Gets the expression to use to check tree membership.Dialect.JDBCInfo
getJDBCTypeAndString(ColumnType type)
Gets the JDBC type and string from Nuxeo's type abstraction.boolean
getMaterializeFulltextSyntheticColumn()
Does the fulltext synthetic column have to be materialized.String
getSecurityCheckSql(String idColumnName)
Gets the expression to use to check security.String
getSQLStatementsFilename()
Gets the name of the file containing the SQL statements.Map<String,Serializable>
getSQLStatementsProperties(Model model, Database database)
Gets the properties to use with the SQL statements.String
getTableName(String name)
String
getTestSQLStatementsFilename()
String
getUpsertSql(List<Column> columns, List<Serializable> values, List<Column> outColumns, List<Serializable> outValues)
Gets the SQL string for an UPSERT expression.String
getUsersSeparator()
boolean
isAllowedConversion(int expected, int actual, String actualName, int actualSize)
Check mismatches between expected and actual JDBC types read from database introspection.boolean
isClusteringSupported()
Checks that clustering is supported.boolean
isConcurrentUpdateException(Throwable t)
Checks if an exception received means that a concurrent update was detected.void
setToPreparedStatement(PreparedStatement ps, int index, Serializable value, Column column)
boolean
supportsArrays()
Does the dialect support passing ARRAY values (to stored procedures mostly).boolean
supportsIfExistsAfterTableName()
boolean
supportsPaging()
Indicates if dialect supports pagingboolean
supportsUpdateFrom()
Does the dialect support UPDATE t SET ...String
toBooleanValueString(boolean bool)
-
Methods inherited from class org.nuxeo.ecm.core.storage.sql.jdbc.dialect.Dialect
castIdToVarchar, closeQuote, createArrayOf, createDialect, getAddColumnString, getAddForeignKeyConstraintString, getAddPrimaryKeyConstraintString, getArrayElementString, getArrayIlikeSql, getArrayInSql, getArrayLikeSql, getArrayResult, getArraySubQuery, getBinaryFulltextSql, getCalendarFromTimestamp, getCalendarFromTimestamp, getCascadeDropConstraintsString, getColumnName, getConnectionSchema, getCreateIndexSql, getCustomColumnDefinition, getCustomPostCreateSqls, getDateCast, getDescending, getDumpStart, getDumpStop, getForeignKeyConstraintName, getFreeVariableSetterForType, getFromResultSetString, getFromResultSetTimestamp, getFulltextType, getGeneratedId, getIdentityGeneratedKeySql, getIdType, getIgnoredColumns, getIndexName, getInsertOnConflictDoNothingSql, getLikeEscaping, getMatchMixinType, getMaximumArgsForIn, getMaxIndexNameSize, getMaxNameSize, getNoColumnsInsertString, getNullColumnString, getPostCreateIdentityColumnSql, getPrepareUserReadAclsSql, getPrimaryKeyConstraintName, getQuotedNameForExpression, getReadAclsCheckSql, getRebuildReadAclsSql, getReturnResultSet, getSoftDeleteCleanupSql, getSoftDeleteSql, getSQLForDump, getStartupSqls, getTableTypeString, getTimestampFromCalendar, getTimestampFromCalendar, getUpdateReadAclsSql, getValidationQuery, hasIdentityGeneratedKey, hasNullEmptyString, isClusteringDeleteNeeded, isIdentityAlreadyPrimary, jdbcInfo, jdbcInfo, jdbcInfo, jdbcInfo, makeName, makeName, needsAliasForDerivedTable, needsNullsLastOnDescSort, needsOracleJoins, needsOrderByKeysAfterDistinct, needsOriginalColumnInGroupBy, needsPrepareUserReadAcls, openQuote, performAdditionalStatements, performPostOpenStatements, qualifyIndexName, registerReturnParameter, setId, setIdLong, setToPreparedStatementString, setToPreparedStatementTimestamp, storesUpperCaseIdentifiers, supportsAncestorsTable, supportsArrayColumns, supportsArraysReturnInsteadOfRows, supportsBatchUpdateCount, supportsCircularCascadeDeleteConstraints, supportsFastDescendants, supportsIfExistsBeforeTableName, supportsIlike, supportsMultipleFulltextIndexes, supportsReadAcl, supportsScroll, supportsSysNameArray, supportsWith, toHexString
-
-
-
-
Field Detail
-
DEFAULT_USERS_SEPARATOR
protected static final String DEFAULT_USERS_SEPARATOR
- See Also:
- Constant Field Values
-
usersSeparator
protected final String usersSeparator
-
disableVersionACL
protected final boolean disableVersionACL
-
disableReadVersionPermission
protected final boolean disableReadVersionPermission
-
-
Constructor Detail
-
DialectH2
public DialectH2(DatabaseMetaData metadata, RepositoryDescriptor repositoryDescriptor)
-
-
Method Detail
-
supportsIfExistsAfterTableName
public boolean supportsIfExistsAfterTableName()
- Overrides:
supportsIfExistsAfterTableName
in classDialect
-
getJDBCTypeAndString
public Dialect.JDBCInfo getJDBCTypeAndString(ColumnType type)
Description copied from class:Dialect
Gets the JDBC type and string from Nuxeo's type abstraction.- Specified by:
getJDBCTypeAndString
in classDialect
-
isAllowedConversion
public boolean isAllowedConversion(int expected, int actual, String actualName, int actualSize)
Description copied from class:Dialect
Check mismatches between expected and actual JDBC types read from database introspection.- Overrides:
isAllowedConversion
in classDialect
-
setToPreparedStatement
public void setToPreparedStatement(PreparedStatement ps, int index, Serializable value, Column column) throws SQLException
- Specified by:
setToPreparedStatement
in classDialect
- Throws:
SQLException
-
getFromResultSet
public Serializable getFromResultSet(ResultSet rs, int index, Column column) throws SQLException
- Specified by:
getFromResultSet
in classDialect
- Throws:
SQLException
-
toBooleanValueString
public String toBooleanValueString(boolean bool)
- Overrides:
toBooleanValueString
in classDialect
-
getTableName
public String getTableName(String name)
- Overrides:
getTableName
in classDialect
-
getCreateFulltextIndexSql
public String getCreateFulltextIndexSql(String indexName, String quotedIndexName, Table table, List<Column> columns, Model model)
Description copied from class:Dialect
Gets a CREATE INDEX statement for a fulltext index.- Specified by:
getCreateFulltextIndexSql
in classDialect
-
getDialectFulltextQuery
public String getDialectFulltextQuery(String query)
Description copied from class:Dialect
Get the dialect-specific version of a fulltext query.- Specified by:
getDialectFulltextQuery
in classDialect
- Parameters:
query
- the CMIS-syntax-based fulltext query string- Returns:
- the dialect native fulltext query string
-
getFulltextScoredMatchInfo
public Dialect.FulltextMatchInfo getFulltextScoredMatchInfo(String fulltextQuery, String indexName, int nthMatch, Column mainColumn, Model model, Database database)
Description copied from class:Dialect
Gets the SQL information needed to do a a fulltext match, either with a direct expression in the WHERE clause, or using a join with an additional table.- Specified by:
getFulltextScoredMatchInfo
in classDialect
-
getMaterializeFulltextSyntheticColumn
public boolean getMaterializeFulltextSyntheticColumn()
Description copied from class:Dialect
Does the fulltext synthetic column have to be materialized.- Specified by:
getMaterializeFulltextSyntheticColumn
in classDialect
-
getFulltextIndexedColumns
public int getFulltextIndexedColumns()
Description copied from class:Dialect
Specifies what columns of the fulltext table have to be indexed.- Specified by:
getFulltextIndexedColumns
in classDialect
- Returns:
- 0 for none, 1 for the synthetic one, 2 for the individual ones
-
supportsUpdateFrom
public boolean supportsUpdateFrom()
Description copied from class:Dialect
Does the dialect support UPDATE t SET ... FROM t, u WHERE ... ?- Specified by:
supportsUpdateFrom
in classDialect
-
doesUpdateFromRepeatSelf
public boolean doesUpdateFromRepeatSelf()
Description copied from class:Dialect
When doing an UPDATE t SET ... FROM t, u WHERE ..., does the FROM clause need to repeate the updated table (t).- Specified by:
doesUpdateFromRepeatSelf
in classDialect
-
getClobCast
public String getClobCast(boolean inOrderBy)
Description copied from class:Dialect
When using a CLOB field in an expression, is some casting required and with what pattern?Needed for H2.
- Overrides:
getClobCast
in classDialect
- Parameters:
inOrderBy
-true
if the expression is for an ORDER BY column- Returns:
- a pattern for String.format with one parameter for the column name and one for the width, or
null
if no cast is required
-
getSecurityCheckSql
public String getSecurityCheckSql(String idColumnName)
Description copied from class:Dialect
Gets the expression to use to check security.- Specified by:
getSecurityCheckSql
in classDialect
- Parameters:
idColumnName
- the quoted name of the id column to use- Returns:
- an SQL expression with two parameters (principals and permissions) that is true if access is allowed
-
getInTreeSql
public String getInTreeSql(String idColumnName, String id)
Description copied from class:Dialect
Gets the expression to use to check tree membership.- Specified by:
getInTreeSql
in classDialect
- Parameters:
idColumnName
- the quoted name of the id column to useid
- the id, to check syntax with respect to specialized id column types- Returns:
- an SQL expression with one parameters for the based id that is true if the document is under base id, or
null
if the query cannot match
-
supportsArrays
public boolean supportsArrays()
Description copied from class:Dialect
Does the dialect support passing ARRAY values (to stored procedures mostly).If not, we'll simulate them using a string and a separator.
- Overrides:
supportsArrays
in classDialect
- Returns:
- true if ARRAY values are supported
-
getUpsertSql
public String getUpsertSql(List<Column> columns, List<Serializable> values, List<Column> outColumns, List<Serializable> outValues)
Description copied from class:Dialect
Gets the SQL string for an UPSERT expression.- Specified by:
getUpsertSql
in classDialect
- Parameters:
columns
- the columns to upsert (first one being the key column)values
- the values to upsert (first one being the key value)outColumns
- the columns to use in the prepared statementoutValues
- the values to use in the prepared statement
-
isConcurrentUpdateException
public boolean isConcurrentUpdateException(Throwable t)
Description copied from class:Dialect
Checks if an exception received means that a concurrent update was detected.- Overrides:
isConcurrentUpdateException
in classDialect
-
getSQLStatementsFilename
public String getSQLStatementsFilename()
Description copied from class:Dialect
Gets the name of the file containing the SQL statements.- Specified by:
getSQLStatementsFilename
in classDialect
-
getTestSQLStatementsFilename
public String getTestSQLStatementsFilename()
- Specified by:
getTestSQLStatementsFilename
in classDialect
-
getSQLStatementsProperties
public Map<String,Serializable> getSQLStatementsProperties(Model model, Database database)
Description copied from class:Dialect
Gets the properties to use with the SQL statements.- Specified by:
getSQLStatementsProperties
in classDialect
-
isClusteringSupported
public boolean isClusteringSupported()
Description copied from class:Dialect
Checks that clustering is supported.- Overrides:
isClusteringSupported
in classDialect
-
getClusterInsertInvalidations
public String getClusterInsertInvalidations()
Description copied from class:Dialect
Gets the SQL to send an invalidation to the cluster.- Overrides:
getClusterInsertInvalidations
in classDialect
- Returns:
- an SQL statement with parameters for: nodeId, id, fragments, kind
-
getClusterGetInvalidations
public String getClusterGetInvalidations()
Description copied from class:Dialect
Gets the SQL to query invalidations for this cluster node.- Overrides:
getClusterGetInvalidations
in classDialect
- Returns:
- an SQL statement returning a result set
-
supportsPaging
public boolean supportsPaging()
Description copied from class:Dialect
Indicates if dialect supports paging- Overrides:
supportsPaging
in classDialect
- Returns:
- true if the dialect supports paging
-
addPagingClause
public String addPagingClause(String sql, long limit, long offset)
Description copied from class:Dialect
Returns the SQL query with a paging clause- Overrides:
addPagingClause
in classDialect
-
getUsersSeparator
public String getUsersSeparator()
-
getBlobLengthFunction
public String getBlobLengthFunction()
Description copied from class:Dialect
Gets the SQL function that returns the length of a blob, in bytes.- Overrides:
getBlobLengthFunction
in classDialect
-
getAncestorsIdsSql
public String getAncestorsIdsSql()
Description copied from class:Dialect
Gets the SQL query to get the ancestors of a set of ids.- Overrides:
getAncestorsIdsSql
in classDialect
- Returns:
- null if not available
-
checkStoredProcedure
public List<String> checkStoredProcedure(String procName, String procCreate, String ddlMode, Connection connection, JDBCLogger logger, Map<String,Serializable> properties) throws SQLException
Description copied from class:Dialect
Checks if a given stored procedure exists and is identical to the passed creation SQL.There are 3 cases to deal with, and actions to perform:
- the stored procedure doesn't exist, and must be created (create the stored procedure);
- the stored procedure exists but is not up to date (drop the old stored procedure and re-create it);
- the stored procedure exists and is up to date (nothing to do).
When there is nothing to do,
null
is returned. Otherwise the returned value is a list of SQL statements to execute. Note that the SQL statements will include also INSERT statements to be executed to remember the creation SQL itself.- Specified by:
checkStoredProcedure
in classDialect
- Parameters:
procName
- the stored procedure nameprocCreate
- the creation SQL for the stored procedureddlMode
- the DDL modeconnection
- the connectionlogger
- the loggerproperties
- the statement execution properties- Returns:
- a list of SQL statements
- Throws:
SQLException
-
-