Module eclipselink

Class SQLServerPlatform

  • All Implemented Interfaces:
    Serializable, Cloneable, org.eclipse.persistence.internal.core.databaseaccess.CorePlatform<org.eclipse.persistence.internal.helper.ConversionManager>, org.eclipse.persistence.internal.databaseaccess.Platform, DDLPlatform

    public class SQLServerPlatform
    extends DatabasePlatform

    Purpose: Provides SQL Server specific behavior.

    Responsibilities:

    • Native SQL for byte[], Date, Time, & Timestamp.
    • Native sequencing using @@IDENTITY.
    See Also:
    Serialized Form
    Since:
    TOPLink/Java 1.0
    • Field Summary

      • Fields inherited from class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

        batchWritingMechanism, castSizeForVarcharParameter, classTypes, cursorCode, DEFAULT_MAX_BATCH_WRITING_SIZE, DEFAULT_PARAMETERIZED_MAX_BATCH_WRITING_SIZE, driverName, driverSupportsNationalCharacterVarying, fieldTypes, IS_VALID_TIMEOUT, isCastRequired, maxBatchWritingSize, partitioningCallback, pingSQL, printInnerJoinInWhereClause, printOuterJoinInWhereClause, shouldBindAllParameters, shouldBindLiterals, shouldBindPartialParameters, shouldCacheAllStatements, shouldCreateIndicesOnForeignKeys, shouldForceBindAllParameters, shouldForceFieldNamesToUpperCase, shouldIgnoreCaseOnFieldComparisons, shouldOptimizeDataConversion, shouldTrimStrings, statementCacheSize, storedProcedureTerminationToken, stringBindingSize, structConverters, supportsAutoCommit, tableCreationSuffix, transactionIsolation, typeConverters, useJDBCStoredProcedureSyntax, useNationalCharacterVarying, useRownumFiltering, usesBatchWriting, usesByteArrayBinding, usesJDBCBatchWriting, usesNativeBatchWriting, usesNativeSQL, usesStreamsForBinding, usesStringBinding
      • Fields inherited from class org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform

        conversionManager, dataTypesConvertedFromAClass, dataTypesConvertedToAClass, defaultNativeSequenceToTable, defaultSeqenceAtNextValue, defaultSequence, endDelimiter, platformOperators, sequences, sequencesLock, startDelimiter, supportsReturnGeneratedKeys, tableQualifier, timestampQuery, uuidQuery
    • Constructor Detail

      • SQLServerPlatform

        public SQLServerPlatform()
    • Method Detail

      • connectionProperties

        public Map<Object,​Object> connectionProperties()
        Description copied from interface: org.eclipse.persistence.internal.databaseaccess.Platform
        INTERNAL: Get platform specific connection properties.
        Returns:
        properties to be added to connection properties
      • initializeConnectionData

        public void initializeConnectionData​(Connection connection)
                                      throws SQLException
        Description copied from class: org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        INTERNAL: Allow initialization from the connection.
        Overrides:
        initializeConnectionData in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        Throws:
        SQLException
      • setDriverSupportsOffsetDateTime

        public void setDriverSupportsOffsetDateTime​(boolean driverSupportsOffsetDateTime)
        Allow user to turn off ODT support, in case they rely on the old behavior.
      • appendByteArray

        protected void appendByteArray​(byte[] bytes,
                                       Writer writer)
                                throws IOException
        If using native SQL then print a byte[] as '0xFF...'
        Overrides:
        appendByteArray in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        Throws:
        IOException
      • appendDate

        protected void appendDate​(Date date,
                                  Writer writer)
                           throws IOException
        Answer a platform correct string representation of a Date, suitable for SQL generation. Native format: 'yyyy-mm-dd
        Overrides:
        appendDate in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        Throws:
        IOException
      • appendSybaseTimestamp

        protected void appendSybaseTimestamp​(Timestamp timestamp,
                                             Writer writer)
                                      throws IOException
        Write a timestamp in Sybase specific format ( yyyy-mm-dd-hh.mm.ss.fff)
        Throws:
        IOException
      • appendSybaseCalendar

        protected void appendSybaseCalendar​(Calendar calendar,
                                            Writer writer)
                                     throws IOException
        Write a timestamp in Sybase specific format ( yyyy-mm-dd-hh.mm.ss.fff)
        Throws:
        IOException
      • appendTime

        protected void appendTime​(Time time,
                                  Writer writer)
                           throws IOException
        Answer a platform correct string representation of a Time, suitable for SQL generation. The time is printed in the ODBC platform independent format {t'hh:mm:ss'}.
        Overrides:
        appendTime in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        Throws:
        IOException
      • appendTimestamp

        protected void appendTimestamp​(Timestamp timestamp,
                                       Writer writer)
                                throws IOException
        Answer a platform correct string representation of a Timestamp, suitable for SQL generation. The date is printed in the ODBC platform independent format {d'YYYY-MM-DD'}.
        Overrides:
        appendTimestamp in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        Throws:
        IOException
      • appendCalendar

        protected void appendCalendar​(Calendar calendar,
                                      Writer writer)
                               throws IOException
        Answer a platform correct string representation of a Calendar, suitable for SQL generation. The date is printed in the ODBC platform independent format {d'YYYY-MM-DD'}.
        Overrides:
        appendCalendar in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        Throws:
        IOException
      • buildClassTypes

        protected Map<String,​Class<?>> buildClassTypes()
        Description copied from class: org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        Return the mapping of class types to database types for the schema framework.
        Overrides:
        buildClassTypes in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • buildFieldTypes

        protected Hashtable<Class<?>,​org.eclipse.persistence.internal.databaseaccess.FieldTypeDefinition> buildFieldTypes()
        Description copied from class: org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        Return the mapping of class types to database types for the schema framework.
        Overrides:
        buildFieldTypes in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • buildSelectQueryForIdentity

        public ValueReadQuery buildSelectQueryForIdentity()
        INTERNAL: Build the identity query for native sequencing.
        Overrides:
        buildSelectQueryForIdentity in class org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform
      • buildSelectQueryForSequenceObject

        public ValueReadQuery buildSelectQueryForSequenceObject​(String qualifiedSeqName,
                                                                Integer size)
        INTERNAL: Produce a DataReadQuery which updates(!) the sequence number in the database and returns it.
        Overrides:
        buildSelectQueryForSequenceObject in class org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform
        Parameters:
        qualifiedSeqName - a defined database sequence
      • dontBindUpdateAllQueryUsingTempTables

        public boolean dontBindUpdateAllQueryUsingTempTables()
        INTERNAL: In SQLServer local temporary table created by one PreparedStatement can't be used in another PreparedStatement. Workaround is to use Statement instead of PreparedStatement.
        Overrides:
        dontBindUpdateAllQueryUsingTempTables in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • getBatchDelimiterString

        public String getBatchDelimiterString()
        Used for batch writing and sp defs.
      • getCreationInOutputProcedureToken

        public String getCreationInOutputProcedureToken()
        This method is used to print the required output parameter token for the specific platform. Used when stored procedures are created.
      • getCreationOutputProcedureToken

        public String getCreationOutputProcedureToken()
        This method is used to print the required output parameter token for the specific platform. Used when stored procedures are created.
      • getInOutputProcedureToken

        public String getInOutputProcedureToken()
        This method is used to print the output parameter token when stored procedures are called
      • getMaxFieldNameSize

        public int getMaxFieldNameSize()
        INTERNAL: returns the maximum number of characters that can be used in a field name on this platform.
      • getNativeTableInfo

        public Vector getNativeTableInfo​(String table,
                                         String creator,
                                         org.eclipse.persistence.internal.sessions.AbstractSession session)
        Return the catalog information through using the native SQL catalog selects. This is required because many JDBC driver do not support meta-data. Willcards can be passed as arguments.
      • getOutputProcedureToken

        public String getOutputProcedureToken()
        This method is used to print the output parameter token when stored procedures are called
      • getProcedureArgumentString

        public String getProcedureArgumentString()
        Used for sp defs.
      • getProcedureCallHeader

        public String getProcedureCallHeader()
        Used for sp calls.
        Overrides:
        getProcedureCallHeader in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • getStoredProcedureParameterPrefix

        public String getStoredProcedureParameterPrefix()
        Overrides:
        getStoredProcedureParameterPrefix in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • getTimestampQuery

        public ValueReadQuery getTimestampQuery()
        PUBLIC: This method returns the query to select the timestamp from the server for SQLServer.
        Specified by:
        getTimestampQuery in interface org.eclipse.persistence.internal.databaseaccess.Platform
        Overrides:
        getTimestampQuery in class org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform
      • getSelectForUpdateString

        public String getSelectForUpdateString()
        INTERNAL: Lock. UPDLOCK seems like the correct table hint to use: HOLDLOCK is too weak - doesn't lock out another read with HOLDLOCK, XLOCK is too strong - locks out another read which doesn't use any locks. UPDLOCK seems to behave exactly like Oracle's FOR UPDATE: locking out updates and other reads with FOR UPDATE but allowing other reads without locks. SQLServer seems to decide itself on the granularity of the lock - it could lock more than the returned rows (for instance a page). It could be forced to obtain to make sure to obtain row level lock: WITH (UPDLOCK, ROWLOCK) However this approach is strongly discouraged because it can consume too much resources: selecting 900 rows from and requiring a "personal" lock for each row may not be feasible because of not enough memory available at the moment - in that case SQLServer will wait until the resource becomes available.
        Overrides:
        getSelectForUpdateString in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • getSelectForUpdateNoWaitString

        public String getSelectForUpdateNoWaitString()
        INTERNAL: This syntax does no wait on the lock.
        Overrides:
        getSelectForUpdateNoWaitString in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • shouldPrintLockingClauseAfterWhereClause

        public boolean shouldPrintLockingClauseAfterWhereClause()
        INTERNAL: Indicates whether locking clause should be printed after where clause by SQLSelectStatement. Example: on Oracle platform (method returns true): SELECT ADDRESS_ID, ... FROM ADDRESS WHERE (ADDRESS_ID = ?) FOR UPDATE on SQLServer platform (method returns false): SELECT ADDRESS_ID, ... FROM ADDRESS WITH (UPDLOCK) WHERE (ADDRESS_ID = ?)
        Overrides:
        shouldPrintLockingClauseAfterWhereClause in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • initializePlatformOperators

        protected void initializePlatformOperators()
        Initialize any platform-specific operators
        Overrides:
        initializePlatformOperators in class org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform
      • trimOperator

        protected static ExpressionOperator trimOperator()
        INTERNAL: Use RTRIM(LTRIM(?)) function for trim.
      • trim2Operator

        protected static ExpressionOperator trim2Operator()
        INTERNAL: Build Trim operator.
      • maximumNumericValues

        public Hashtable<Class<? extends Number>,​? super Number> maximumNumericValues()
        Builds a table of maximum numeric values keyed on java class. This is used for type testing but might also be useful to end users attempting to sanitize values.

        NOTE: BigInteger & BigDecimal maximums are dependent upon their precision & Scale

        Overrides:
        maximumNumericValues in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • minimumNumericValues

        public Hashtable<Class<? extends Number>,​? super Number> minimumNumericValues()
        Builds a table of minimum numeric values keyed on java class. This is used for type testing but might also be useful to end users attempting to sanitize values.

        NOTE: BigInteger & BigDecimal minimums are dependent upon their precision & Scale

        Overrides:
        minimumNumericValues in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • modOperator

        protected ExpressionOperator modOperator()
        Override the default MOD operator.
      • singleArgumentSubstringOperator

        protected static ExpressionOperator singleArgumentSubstringOperator()
        Override the default SubstringSingleArg operator.
      • locate2Operator

        protected static ExpressionOperator locate2Operator()
        INTERNAL: create the Locate2 Operator for this platform
      • addMonthsOperator

        protected static ExpressionOperator addMonthsOperator()
        INTERNAL: Function, to add months to a date.
      • inStringOperator

        protected static ExpressionOperator inStringOperator()
        INTERNAL: Build instring operator
      • toNumberOperator

        protected static ExpressionOperator toNumberOperator()
        INTERNAL: Build Sybase equivalent to TO_NUMBER.
      • toDateToStringOperator

        protected static ExpressionOperator toDateToStringOperator()
        INTERNAL: Build Sybase equivalent to TO_CHAR.
      • toDateOperator

        protected static ExpressionOperator toDateOperator()
        INTERNAL: Build Sybase equivalent to TO_DATE.
      • toCharOperator

        protected static ExpressionOperator toCharOperator()
        INTERNAL: Build Sybase equivalent to TO_CHAR.
      • locateOperator

        protected static ExpressionOperator locateOperator()
        INTERNAL: Build the Sybase equivalent to Locate
      • isOutputAllowWithResultSet

        public boolean isOutputAllowWithResultSet()
        INTERNAL: Return true if output parameters can be built with result sets.
        Overrides:
        isOutputAllowWithResultSet in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • isSQLServer

        public boolean isSQLServer()
        Specified by:
        isSQLServer in interface org.eclipse.persistence.internal.databaseaccess.Platform
        Overrides:
        isSQLServer in class org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform
      • printFieldIdentityClause

        public void printFieldIdentityClause​(Writer writer)
                                      throws ValidationException
        INTERNAL: Append the receiver's field 'identity' constraint clause to a writer.
        Parameters:
        writer - the writer to append to
        Throws:
        ValidationException
      • printFieldNullClause

        public void printFieldNullClause​(Writer writer)
                                  throws ValidationException
        INTERNAL: Append the receiver's field 'NULL' constraint clause to a writer.
        Parameters:
        writer - the writer to append to
        Throws:
        ValidationException
      • requiresProcedureCallBrackets

        public boolean requiresProcedureCallBrackets()
        USed for sp calls.
        Overrides:
        requiresProcedureCallBrackets in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • requiresProcedureCallOuputToken

        public boolean requiresProcedureCallOuputToken()
        Used for sp calls. Sybase must print output after output params.
        Overrides:
        requiresProcedureCallOuputToken in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • shouldPrintInOutputTokenBeforeType

        public boolean shouldPrintInOutputTokenBeforeType()
        This is required in the construction of the stored procedures with output parameters
        Overrides:
        shouldPrintInOutputTokenBeforeType in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • shouldPrintOutputTokenBeforeType

        public boolean shouldPrintOutputTokenBeforeType()
        This is required in the construction of the stored procedures with output parameters
      • shouldUseJDBCOuterJoinSyntax

        public boolean shouldUseJDBCOuterJoinSyntax()
        JDBC defines and outer join syntax, many drivers do not support this. So we normally avoid it.
        Overrides:
        shouldUseJDBCOuterJoinSyntax in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • supportsIdentity

        public boolean supportsIdentity()
        INTERNAL: Indicates whether the platform supports identity. SQLServer does through IDENTITY field types. This method is to be used *ONLY* by sequencing classes
        Overrides:
        supportsIdentity in class org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform
      • supportsSequenceObjects

        public boolean supportsSequenceObjects()
        INTERNAL:
        Overrides:
        supportsSequenceObjects in class org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform
      • supportsLocalTempTables

        public boolean supportsLocalTempTables()
        INTERNAL:
        Overrides:
        supportsLocalTempTables in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • getCreateTempTableSqlPrefix

        protected String getCreateTempTableSqlPrefix()
        INTERNAL:
        Overrides:
        getCreateTempTableSqlPrefix in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • getTempTableForTable

        public org.eclipse.persistence.internal.helper.DatabaseTable getTempTableForTable​(org.eclipse.persistence.internal.helper.DatabaseTable table)
        INTERNAL:
        Overrides:
        getTempTableForTable in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        Parameters:
        table - is original table for which temp table is created.
        Returns:
        temporary table
      • writeUpdateOriginalFromTempTableSql

        public void writeUpdateOriginalFromTempTableSql​(Writer writer,
                                                        org.eclipse.persistence.internal.helper.DatabaseTable table,
                                                        Collection<org.eclipse.persistence.internal.helper.DatabaseField> pkFields,
                                                        Collection<org.eclipse.persistence.internal.helper.DatabaseField> assignedFields)
                                                 throws IOException
        INTERNAL:
        Overrides:
        writeUpdateOriginalFromTempTableSql in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        Parameters:
        writer - for writing the sql
        table - is original table for which temp table is created.
        pkFields - primary key fields for the original table.
        assignedFields - fields to be assigned a new value.
        Throws:
        IOException
      • printSQLSelectStatement

        public void printSQLSelectStatement​(org.eclipse.persistence.internal.databaseaccess.DatabaseCall call,
                                            org.eclipse.persistence.internal.expressions.ExpressionSQLPrinter printer,
                                            org.eclipse.persistence.internal.expressions.SQLSelectStatement statement)
        Description copied from class: org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        INTERNAL: Print the SQL representation of the statement on a stream, storing the fields in the DatabaseCall.
        Overrides:
        printSQLSelectStatement in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
      • getObjectFromResultSet

        public Object getObjectFromResultSet​(ResultSet resultSet,
                                             int columnNumber,
                                             int type,
                                             org.eclipse.persistence.internal.sessions.AbstractSession session)
                                      throws SQLException
        Description copied from class: org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        INTERNAL: Get the object from the JDBC Result set. Added to allow other platforms to override.
        Overrides:
        getObjectFromResultSet in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        Throws:
        SQLException
        See Also:
        "org.eclipse.persistence.platform.database.oracle.Oracle9Plaform"
      • setParameterValueInDatabaseCall

        public void setParameterValueInDatabaseCall​(Object parameter,
                                                    PreparedStatement statement,
                                                    int index,
                                                    org.eclipse.persistence.internal.sessions.AbstractSession session)
                                             throws SQLException
        Description copied from class: org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        INTERNAL Set the parameter in the JDBC statement at the given index. This support a wide range of different parameter types, and is heavily optimized for common types.
        Overrides:
        setParameterValueInDatabaseCall in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        Throws:
        SQLException
      • setParameterValueInDatabaseCall

        public void setParameterValueInDatabaseCall​(Object parameter,
                                                    CallableStatement statement,
                                                    String name,
                                                    org.eclipse.persistence.internal.sessions.AbstractSession session)
                                             throws SQLException
        Description copied from class: org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        INTERNAL Set the parameter in the JDBC statement with the given name. This support a wide range of different parameter types, and is heavily optimized for common types.
        Overrides:
        setParameterValueInDatabaseCall in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
        Throws:
        SQLException