Class DialectOracle

java.lang.Object
org.nuxeo.ecm.core.storage.sql.jdbc.dialect.Dialect
org.nuxeo.ecm.core.storage.sql.jdbc.dialect.DialectOracle

public class DialectOracle extends Dialect
Oracle-specific dialect.
Author:
Florent Guillaume
  • Field Details

    • USE_CLOB_PROPERTY

      public static final String USE_CLOB_PROPERTY
      See Also:
    • CLOB_LENGTH_MIN_VALUE

      public static final int CLOB_LENGTH_MIN_VALUE
      See Also:
    • oraclePreparedStatementClass

      protected Class<PreparedStatement> oraclePreparedStatementClass
    • oraclePreparedStatementRegisterReturnParameter

      protected Method oraclePreparedStatementRegisterReturnParameter
    • oraclePreparedStatementGetReturnResultSet

      protected Method oraclePreparedStatementGetReturnResultSet
    • fulltextParameters

      protected final String fulltextParameters
    • pathOptimizationsEnabled

      protected boolean pathOptimizationsEnabled
    • pathOptimizationsVersion

      protected int pathOptimizationsVersion
    • disableVersionACL

      protected final boolean disableVersionACL
    • disableReadVersionPermission

      protected final boolean disableReadVersionPermission
    • usersSeparator

      protected String usersSeparator
    • idType

      protected final Dialect.DialectIdType idType
    • idSequenceName

      protected String idSequenceName
    • majorVersion

      protected int majorVersion
    • xaErrorLogger

      protected DialectOracle.XAErrorLogger xaErrorLogger
    • CHARS_RESERVED_STR

      protected static final String CHARS_RESERVED_STR
      See Also:
    • CHARS_RESERVED

      protected static final Set<Character> CHARS_RESERVED
  • Constructor Details

  • Method Details

    • newXAErrorLogger

      protected DialectOracle.XAErrorLogger newXAErrorLogger()
    • registerReturnParameter

      public void registerReturnParameter(PreparedStatement ps, int parameterIndex, int sqlType) throws SQLException
      Description copied from class: Dialect
      Registers return parameters.

      Used for Oracle "DML Returning".

      Overrides:
      registerReturnParameter in class Dialect
      Throws:
      SQLException
    • getReturnResultSet

      public ResultSet getReturnResultSet(PreparedStatement ps) throws SQLException
      Description copied from class: Dialect
      Gets return ResultSet.

      Used for Oracle "DML Returning".

      Overrides:
      getReturnResultSet in class Dialect
      Throws:
      SQLException
    • getNoColumnsInsertString

      public String getNoColumnsInsertString(Column idColumn)
      Overrides:
      getNoColumnsInsertString in class Dialect
    • getConnectionSchema

      public String getConnectionSchema(Connection connection) throws SQLException
      Description copied from class: Dialect
      Gets the schema to use to query metadata about existing tables.
      Overrides:
      getConnectionSchema in class Dialect
      Throws:
      SQLException
    • getCascadeDropConstraintsString

      public String getCascadeDropConstraintsString()
      Overrides:
      getCascadeDropConstraintsString in class Dialect
    • getAddColumnString

      public String getAddColumnString()
      Overrides:
      getAddColumnString in class Dialect
    • 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 class Dialect
    • 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 class Dialect
    • getGeneratedId

      public Serializable getGeneratedId(Connection connection) throws SQLException
      Description copied from class: Dialect
      Gets a generated id if so configured, otherwise returns null.
      Overrides:
      getGeneratedId in class Dialect
      Throws:
      SQLException
    • setId

      public void setId(PreparedStatement ps, int index, Serializable value) throws SQLException
      Description copied from class: Dialect
      Sets a prepared statement value that is a Nuxeo main id (usually UUID).
      Overrides:
      setId in class Dialect
      Parameters:
      ps - the prepared statement
      index - the parameter index in the prepared statement
      value - the value to set
      Throws:
      SQLException
    • setToPreparedStatement

      public void setToPreparedStatement(PreparedStatement ps, int index, Serializable value, Column column) throws SQLException
      Specified by:
      setToPreparedStatement in class Dialect
      Throws:
      SQLException
    • getFromResultSet

      public Serializable getFromResultSet(ResultSet rs, int index, Column column) throws SQLException
      Specified by:
      getFromResultSet in class Dialect
      Throws:
      SQLException
    • getMaxNameSize

      protected int getMaxNameSize()
      Overrides:
      getMaxNameSize in class Dialect
    • getMaxIndexNameSize

      protected int getMaxIndexNameSize()
      Overrides:
      getMaxIndexNameSize in class Dialect
    • 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 class Dialect
    • getDialectFulltextQuery

      public String getDialectFulltextQuery(String query)
      Description copied from class: Dialect
      Get the dialect-specific version of a fulltext query.
      Specified by:
      getDialectFulltextQuery in class Dialect
      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 class Dialect
    • getMaterializeFulltextSyntheticColumn

      public boolean getMaterializeFulltextSyntheticColumn()
      Description copied from class: Dialect
      Does the fulltext synthetic column have to be materialized.
      Specified by:
      getMaterializeFulltextSyntheticColumn in class Dialect
    • getFulltextIndexedColumns

      public int getFulltextIndexedColumns()
      Description copied from class: Dialect
      Specifies what columns of the fulltext table have to be indexed.
      Specified by:
      getFulltextIndexedColumns in class Dialect
      Returns:
      0 for none, 1 for the synthetic one, 2 for the individual ones
    • getLikeEscaping

      public String getLikeEscaping()
      Description copied from class: Dialect
      Gets the SQL fragment to add after a LIKE match to specify the escaping character.
      Overrides:
      getLikeEscaping in class Dialect
    • supportsUpdateFrom

      public boolean supportsUpdateFrom()
      Description copied from class: Dialect
      Does the dialect support UPDATE t SET ... FROM t, u WHERE ... ?
      Specified by:
      supportsUpdateFrom in class Dialect
    • 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 class Dialect
    • needsOriginalColumnInGroupBy

      public boolean needsOriginalColumnInGroupBy()
      Description copied from class: Dialect
      Whether a GROUP BY can only be used with the original column name and not an alias.
      Overrides:
      needsOriginalColumnInGroupBy in class Dialect
    • needsOracleJoins

      public boolean needsOracleJoins()
      Description copied from class: Dialect
      Whether implicit Oracle joins (instead of explicit ANSI joins) are needed.
      Overrides:
      needsOracleJoins in class Dialect
    • 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 class Dialect
      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
    • getQuotedNameForExpression

      public String getQuotedNameForExpression(Column column)
      Description copied from class: Dialect
      Gets the SQL to use to refer to a column in an expression.

      Needed for Oracle CLOB.

      Overrides:
      getQuotedNameForExpression in class Dialect
      Parameters:
      column - the column used in an expression
      Returns:
      the SQL to use to refer to it
    • supportsReadAcl

      public boolean supportsReadAcl()
      Description copied from class: Dialect
      Does the dialect support an optimized read security checks
      Overrides:
      supportsReadAcl in class Dialect
    • getPrepareUserReadAclsSql

      public String getPrepareUserReadAclsSql()
      Description copied from class: Dialect
      Gets the SQL expression to prepare the user read acls cache. This can be used to populate a table cache.
      Overrides:
      getPrepareUserReadAclsSql in class Dialect
      Returns:
      and SQL expression with one parameter (principals)
    • getReadAclsCheckSql

      public String getReadAclsCheckSql(String userIdCol)
      Description copied from class: Dialect
      Gets the expression to check if access is allowed using read acls. The dialect must suppportsReadAcl.
      Overrides:
      getReadAclsCheckSql in class Dialect
      Parameters:
      userIdCol - the quoted name of the aclr_user_map user_id column to use
      Returns:
      an SQL expression with one parameter (principals) that is true if access is allowed
    • getUpdateReadAclsSql

      public String getUpdateReadAclsSql()
      Description copied from class: Dialect
      Gets the statement to update the read acls
      Overrides:
      getUpdateReadAclsSql in class Dialect
    • getRebuildReadAclsSql

      public String getRebuildReadAclsSql()
      Description copied from class: Dialect
      Gets the statement to rebuild the wall read acls
      Overrides:
      getRebuildReadAclsSql in class Dialect
    • getSecurityCheckSql

      public String getSecurityCheckSql(String idColumnName)
      Description copied from class: Dialect
      Gets the expression to use to check security.
      Specified by:
      getSecurityCheckSql in class Dialect
      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
    • supportsFastDescendants

      public boolean supportsFastDescendants()
      Description copied from class: Dialect
      Checks whether Dialect.getInTreeSql(String, String) is optimized for fast results (using an ancestors or descendants table).
      Overrides:
      supportsFastDescendants in class Dialect
    • 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 class Dialect
      Parameters:
      idColumnName - the quoted name of the id column to use
      id - 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
    • 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 class Dialect
      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 statement
      outValues - the values to use in the prepared statement
    • getInsertOnConflictDoNothingSql

      public String getInsertOnConflictDoNothingSql(List<Column> columns, List<Serializable> values, List<Column> outColumns, List<Serializable> outValues)
      Description copied from class: Dialect
      Gets the SQL string for an INSERT ... ON CONFLICT DO NOTHING expression.
      Overrides:
      getInsertOnConflictDoNothingSql in class Dialect
      Parameters:
      columns - the columns to insert (first one being the key column)
      values - the values to insert (first one being the key value)
      outColumns - the columns to use in the prepared statement
      outValues - the values to use in the prepared statement
    • getMergeSql

      protected String getMergeSql(List<Column> columns, List<Serializable> values, List<Column> outColumns, List<Serializable> outValues, boolean updateWhenMatched)
    • isClusteringSupported

      public boolean isClusteringSupported()
      Description copied from class: Dialect
      Checks that clustering is supported.
      Overrides:
      isClusteringSupported in class Dialect
    • isClusteringDeleteNeeded

      public boolean isClusteringDeleteNeeded()
      Description copied from class: Dialect
      Does clustering fetch of invalidations ( Dialect.getClusterGetInvalidations()) need a separate delete for them.
      Overrides:
      isClusteringDeleteNeeded in class Dialect
    • getClusterInsertInvalidations

      public String getClusterInsertInvalidations()
      Description copied from class: Dialect
      Gets the SQL to send an invalidation to the cluster.
      Overrides:
      getClusterInsertInvalidations in class Dialect
      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 class Dialect
      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 class Dialect
      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 class Dialect
    • supportsWith

      public boolean supportsWith()
      Description copied from class: Dialect
      Does the dialect support SQL-99 WITH common table expressions.
      Overrides:
      supportsWith in class Dialect
    • 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 class Dialect
      Returns:
      true if ARRAY values are supported
    • supportsArraysReturnInsteadOfRows

      public boolean supportsArraysReturnInsteadOfRows()
      Description copied from class: Dialect
      Does a stored function returning an result set need to access it as a single array instead of iterating over a normal result set's rows.

      Oracle needs this.

      Overrides:
      supportsArraysReturnInsteadOfRows in class Dialect
    • getArrayResult

      public Serializable[] getArrayResult(Array array) throws SQLException
      Description copied from class: Dialect
      Gets the array result as a converted array of Serializable.
      Overrides:
      getArrayResult in class Dialect
      Throws:
      SQLException
    • hasNullEmptyString

      public boolean hasNullEmptyString()
      Description copied from class: Dialect
      Does the dialect have an empty string identical to NULL (Oracle).
      Overrides:
      hasNullEmptyString in class Dialect
    • createArrayOf

      public Array createArrayOf(int type, Object[] elements, Connection connection) throws SQLException
      Description copied from class: Dialect
      Factory method for creating Array objects, suitable for passing to PreparedStatement.setArray(int, java.sql.Array).

      (An equivalent method is defined by JDBC4 on the Connection class.)

      Overrides:
      createArrayOf in class Dialect
      Parameters:
      type - the SQL type of the elements
      elements - the elements of the array
      connection - the connection
      Returns:
      an Array holding the elements
      Throws:
      SQLException
    • getSQLStatementsFilename

      public String getSQLStatementsFilename()
      Description copied from class: Dialect
      Gets the name of the file containing the SQL statements.
      Specified by:
      getSQLStatementsFilename in class Dialect
    • getTestSQLStatementsFilename

      public String getTestSQLStatementsFilename()
      Specified by:
      getTestSQLStatementsFilename in class Dialect
    • 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 class Dialect
    • getOracleErrorCode

      protected int getOracleErrorCode(Throwable t)
    • isConnectionClosed

      protected boolean isConnectionClosed(int oracleError)
    • 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 class Dialect
    • getValidationQuery

      public String getValidationQuery()
      Description copied from class: Dialect
      A query that, when executed, will make at least a round-trip to the server to check that the connection is alive.

      The query should throw an error if the connection is dead.

      Overrides:
      getValidationQuery in class Dialect
    • 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 class Dialect
    • getPostCreateIdentityColumnSql

      public List<String> getPostCreateIdentityColumnSql(Column column)
      Description copied from class: Dialect
      Gets additional SQL statements to execute after the CREATE TABLE when creating an identity column.

      Oracle needs both a sequence and a trigger.

      Overrides:
      getPostCreateIdentityColumnSql in class Dialect
    • hasIdentityGeneratedKey

      public boolean hasIdentityGeneratedKey()
      Description copied from class: Dialect
      True if the dialect returns the generated key for the identity from the insert statement.

      Oracle needs a separate call to CURRVAL.

      Overrides:
      hasIdentityGeneratedKey in class Dialect
    • getIdentityGeneratedKeySql

      public String getIdentityGeneratedKeySql(Column column)
      Description copied from class: Dialect
      Gets the SQL query to execute to retrieve the last generated identity key.

      Oracle needs a separate call to CURRVAL.

      Overrides:
      getIdentityGeneratedKeySql in class Dialect
    • 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 class Dialect
      Returns:
      null if not available
    • needsNullsLastOnDescSort

      public boolean needsNullsLastOnDescSort()
      Description copied from class: Dialect
      True if the dialect need an extra NULLS LAST on DESC sort.
      Overrides:
      needsNullsLastOnDescSort in class Dialect
    • getDateCast

      public String getDateCast()
      Description copied from class: Dialect
      Get the expression to use to cast a column to a DATE type.
      Overrides:
      getDateCast in class Dialect
      Returns:
      a pattern for String.format with one parameter for the column name
    • castIdToVarchar

      public String castIdToVarchar(String expr)
      Description copied from class: Dialect
      Casts an id column to a VARCHAR type.

      Used for uuid/varchar joins.

      Overrides:
      castIdToVarchar in class Dialect
      Returns:
      the casted expression
    • getIdType

      public Dialect.DialectIdType getIdType()
      Description copied from class: Dialect
      Gets the type of id when stored in the database.
      Overrides:
      getIdType in class Dialect
    • getUsersSeparator

      public String getUsersSeparator()
    • getSoftDeleteSql

      public String getSoftDeleteSql()
      Description copied from class: Dialect
      SQL to soft delete documents. SQL returned has free parameters for the array of ids and time.
      Overrides:
      getSoftDeleteSql in class Dialect
    • getSoftDeleteCleanupSql

      public String getSoftDeleteCleanupSql()
      Description copied from class: Dialect
      SQL to clean soft-delete documents. SQL returned has free parameters max and beforeTime.
      Overrides:
      getSoftDeleteCleanupSql in class Dialect
    • getStartupSqls

      public List<String> getStartupSqls(Model model, Database database)
      Description copied from class: Dialect
      Gets the sql statements to execute after the repository init (at startup).

      Used for vacuum-like operations.

      Overrides:
      getStartupSqls in class Dialect
    • 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 class Dialect
      Parameters:
      procName - the stored procedure name
      procCreate - the creation SQL for the stored procedure
      ddlMode - the DDL mode
      connection - the connection
      logger - the logger
      properties - the statement execution properties
      Returns:
      a list of SQL statements
      Throws:
      SQLException
    • normalizeString

      protected static String normalizeString(String string)
    • getSQLForDump

      public String getSQLForDump(String sql)
      Description copied from class: Dialect
      Returns the SQL statement with proper terminator to use in a dump.
      Overrides:
      getSQLForDump in class Dialect
      Returns:
      the SQL statement
    • supportsBatchUpdateCount

      public boolean supportsBatchUpdateCount()
      Description copied from class: Dialect
      Does the dialect report accurate update counts for batch updates.
      Overrides:
      supportsBatchUpdateCount in class Dialect