org.eclipse.persistence.platform.database
Class MySQLPlatform

java.lang.Object
  extended by org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform
      extended by org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
          extended by org.eclipse.persistence.platform.database.DatabasePlatform
              extended by org.eclipse.persistence.platform.database.MySQLPlatform
All Implemented Interfaces:
Serializable, Cloneable, org.eclipse.persistence.internal.databaseaccess.Platform

public class MySQLPlatform
extends DatabasePlatform

Purpose: Provides MySQL specific behavior.

Responsibilities:

Since:
OracleAS TopLink 10g (10.1.3)
See Also:
Serialized Form

Field Summary
 
Fields inherited from class org.eclipse.persistence.platform.database.DatabasePlatform
DEFAULT_VARCHAR_SIZE
 
Fields inherited from class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
DEFAULT_MAX_BATCH_WRITING_SIZE, DEFAULT_PARAMETERIZED_MAX_BATCH_WRITING_SIZE, Types_NCLOB, Types_SQLXML
 
Constructor Summary
MySQLPlatform()
           
 
Method Summary
 String buildProcedureCallString(StoredProcedureCall call, org.eclipse.persistence.internal.sessions.AbstractSession session)
          Return the proc syntax for this platform.
 ValueReadQuery buildSelectQueryForIdentity()
          INTERNAL: Build the identity query for native sequencing.
 boolean canBatchWriteWithOptimisticLocking()
          INTERNAL: Supports Batch Writing with Optimistic Locking.
 int computeMaxRowsForSQL(int firstResultIndex, int maxResults)
          INTERNAL: Use the JDBC maxResults and firstResultIndex setting to compute a value to use when limiting the results of a query in SQL.
 int executeBatch(Statement statement, boolean isStatementPrepared)
          Internal: This gets called on each batch statement execution Needs to be implemented so that it returns the number of rows successfully modified by this statement for optimistic locking purposes (if useNativeBatchWriting is enabled, and the call uses optimistic locking).
 String getConstraintDeletionString()
          INTERNAL: Used for constraint deletion.
 String getFunctionCallHeader()
          Used for stored function calls.
 String getIdentifierQuoteCharacter()
          Deprecated.  
 String getInOutputProcedureToken()
          INTERNAL: MySQL uses the INOUT keyword for this.
 String getProcedureAsString()
          MySQL does not use the AS token.
 String getProcedureBeginString()
          INTERNAL: MySQL requires BEGIN.
 String getProcedureCallHeader()
          INTERNAL: Used for stored procedure calls.
 String getProcedureCallTail()
          Used for sp calls.
 String getProcedureEndString()
          INTERNAL: MySQL requires END.
 String getSelectForUpdateString()
          INTERNAL: Used for pessimistic locking.
 ValueReadQuery getTimestampQuery()
          INTERNAL: This method returns the query to select the timestamp from the server for MySQL.
 boolean isMySQL()
          Answers whether platform is MySQL.
 void printFieldIdentityClause(Writer writer)
          INTERNAL: Append the receiver's field 'identity' constraint clause to a writer.
 void printSQLSelectStatement(org.eclipse.persistence.internal.databaseaccess.DatabaseCall call, org.eclipse.persistence.internal.expressions.ExpressionSQLPrinter printer, org.eclipse.persistence.internal.expressions.SQLSelectStatement statement)
          INTERNAL: Print the SQL representation of the statement on a stream, storing the fields in the DatabaseCall.
 void printStoredFunctionReturnKeyWord(Writer writer)
          INTERNAL: Prints return keyword for StoredFunctionDefinition: CREATE FUNCTION StoredFunction_In (P_IN BIGINT) RETURN BIGINT The method was introduced because MySQL requires "RETURNS" instead: CREATE FUNCTION StoredFunction_In (P_IN BIGINT) RETURNS BIGINT
 boolean shouldAlwaysUseTempStorageForModifyAll()
          INTERNAL: MySQL supports temp tables for update-all, delete-all queries.
 boolean shouldPrintOutputTokenAtStart()
          INTERNAL: MySQL requires the direction at the start of the argument.
 boolean shouldPrintStoredProcedureArgumentNameInCall()
          INTERNAL: MySQL stored procedure calls do not require the argument name be printed in the call string e.g.
 boolean shouldUseJDBCOuterJoinSyntax()
          INTERNAL: JDBC defines an outer join syntax which many drivers do not support.
 boolean supportsAutoConversionToNumericForArithmeticOperations()
          Some db allow VARCHAR db field to be used in arithmetic operations automatically converting them to numeric: UPDATE OL_PHONE SET PHONE_ORDER_VARCHAR = (PHONE_ORDER_VARCHAR + 1) WHERE ...
 boolean supportsGlobalTempTables()
          INTERNAL: MySQL supports temp tables for update-all, delete-all queries.
 boolean supportsIdentity()
          INTERNAL: Indicates whether the platform supports identity.
 boolean supportsIndividualTableLocking()
          INTERNAL: Indicates whether locking clause could be selectively applied only to some tables in a ReadQuery.
 boolean supportsStoredFunctions()
           
 void writeDeleteFromTargetTableUsingTempTableSql(Writer writer, org.eclipse.persistence.internal.helper.DatabaseTable table, org.eclipse.persistence.internal.helper.DatabaseTable targetTable, Collection pkFields, Collection targetPkFields)
          INTERNAL: Writes MySQL specific SQL for accessing temp tables for delete-all queries.
 void writeUpdateOriginalFromTempTableSql(Writer writer, org.eclipse.persistence.internal.helper.DatabaseTable table, Collection pkFields, Collection assignedFields)
          INTERNAL: Writes MySQL specific SQL for accessing temp tables for update-all queries.
 
Methods inherited from class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
addBatch, addStructConverter, allowsSizeInProcedureArguments, appendLiteralToCall, appendParameter, appendParameterInternal, autoCommit, beginTransaction, buildCallWithReturning, buildCreateIndex, buildDropIndex, buildSelectQueryForIdentity, buildSelectQueryForSequenceObject, buildSelectQueryForSequenceObject, buildSequenceObjectAlterIncrementWriter, buildSequenceObjectCreationWriter, buildSequenceObjectDeletionWriter, canBatchWriteWithOptimisticLocking, canBuildCallWithReturning, commitTransaction, convertToDatabaseType, copyInto, createArray, createArray, createStruct, createStruct, dontBindUpdateAllQueryUsingTempTables, executeStoredProcedure, freeTemporaryObject, getAssignmentString, getBatchBeginString, getBatchDelimiterString, getBatchEndString, getCastSizeForVarcharParameter, getClassTypes, getConnection, getCreateViewString, getCreationInOutputProcedureToken, getCreationOutputProcedureToken, getCursorCode, getCustomModifyValueForCall, getDefaultSequenceTableName, getFieldTypeDefinition, getFieldTypes, getInputProcedureToken, getJDBCOuterJoinString, getJDBCType, getJDBCType, getJdbcTypeName, getMaxBatchWritingSize, getMaxFieldNameSize, getMaxForeignKeyNameSize, getMaxIndexNameSize, getMaxUniqueKeyNameSize, getNoWaitString, getObjectFromResultSet, getOutputProcedureToken, getPingSQL, getProcedureArgumentSetter, getProcedureArgumentString, getQualifiedName, getQualifiedSequenceTableName, getRefValue, getRefValue, getSelectForUpdateNoWaitString, getSelectForUpdateOfString, getSelectForUpdateWaitString, getSequenceCounterFieldName, getSequenceNameFieldName, getSequencePreallocationSize, getSequenceTableName, getStatementCacheSize, getStoredProcedureParameterPrefix, getStoredProcedureTerminationToken, getStringBindingSize, getStructConverters, getTempTableForTable, getTransactionIsolation, getTypeConverters, initialize, isAlterSequenceObjectSupported, isCastRequired, isDynamicSQLRequiredForFunctions, isForUpdateCompatibleWithDistinct, isInformixOuterJoin, isLockTimeoutException, isNullAllowedInSelectClause, isXDBDocument, maximumNumericValues, minimumNumericValues, prepareBatchStatement, printFieldNotNullClause, printFieldNullClause, printFieldTypeSize, printFieldUnique, printValuelist, printValuelist, registerOutputParameter, requiresNamedPrimaryKeyConstraints, requiresProcedureBrackets, requiresProcedureCallBrackets, requiresProcedureCallOuputToken, requiresTypeNameToRegisterOutputParameter, requiresUniqueConstraintCreationOnTableCreate, retrieveFirstPrimaryKeyOrOne, rollbackTransaction, setCastSizeForVarcharParameter, setCursorCode, setIsCastRequired, setMaxBatchWritingSize, setParameterValueInDatabaseCall, setPingSQL, setPrintOuterJoinInWhereClause, setSequenceCounterFieldName, setSequenceNameFieldName, setSequenceTableName, setShouldBindAllParameters, setShouldBindLiterals, setShouldCacheAllStatements, setShouldForceFieldNamesToUpperCase, setShouldIgnoreCaseOnFieldComparisons, setShouldOptimizeDataConversion, setShouldTrimStrings, setShouldUseRownumFiltering, setStatementCacheSize, setStringBindingSize, setSupportsAutoCommit, setTransactionIsolation, setUsesBatchWriting, setUsesByteArrayBinding, setUsesJDBCBatchWriting, setUsesNativeBatchWriting, setUsesNativeSQL, setUsesStreamsForBinding, setUsesStringBinding, shouldBindAllParameters, shouldBindLiterals, shouldCacheAllStatements, shouldCreateIndicesForPrimaryKeys, shouldCreateIndicesOnUniqueKeys, shouldForceFieldNamesToUpperCase, shouldIgnoreCaseOnFieldComparisons, shouldIgnoreException, shouldNativeSequenceUseTransaction, shouldOptimizeDataConversion, shouldPrintAliasForUpdate, shouldPrintConstraintNameAfter, shouldPrintFieldIdentityClause, shouldPrintInOutputTokenBeforeType, shouldPrintInputTokenAtStart, shouldPrintLockingClauseAfterWhereClause, shouldPrintOuterJoinInWhereClause, shouldPrintOutputTokenBeforeType, shouldPrintStoredProcedureVariablesAfterBeginString, shouldTrimStrings, shouldUseCustomModifyForCall, shouldUseRownumFiltering, supportsANSIInnerJoinSyntax, supportsAutoCommit, supportsForeignKeyConstraints, supportsLocalTempTables, supportsLockingQueriesWithMultipleTables, supportsNativeSequenceNumbers, supportsNestingOuterJoins, supportsOuterJoinsWithBrackets, supportsPrimaryKeyConstraint, supportsSequenceObjects, supportsTempTables, supportsUniqueColumns, supportsUniqueKeyConstraints, usesBatchWriting, usesByteArrayBinding, usesJDBCBatchWriting, usesNativeBatchWriting, usesNativeSQL, usesSequenceTable, usesStreamsForBinding, usesStringBinding, wasFailureCommunicationBased, writeCleanUpTempTableSql, writeCreateTempTableSql, writeDeleteFromTargetTableUsingTempTableSql, writeInsertIntoTableSql, writeLOB, writeParameterMarker
 
Methods inherited from class org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform
addSequence, clone, convertObject, createConnectionCustomizer, getConversionManager, getDataTypesConvertedFrom, getDataTypesConvertedTo, getDefaultSequence, getDefaultSequenceToWrite, getEndDelimiter, getOperator, getPlatformOperators, getSelectSequenceQuery, getSequence, getSequences, getSequencesToWrite, getStartDelimiter, getTableQualifier, getTimestampFromServer, getUpdateSequenceQuery, hasDefaultSequence, isAccess, isAttunity, isCloudscape, isDB2, isDBase, isDerby, isFirebird, isH2, isHSQL, isInformix, isODBC, isOracle, isOracle9, isPointBase, isPostgreSQL, isSQLAnywhere, isSQLServer, isSybase, isSymfoware, isTimesTen, isTimesTen7, removeAllSequences, removeSequence, setConversionManager, setDefaultSequence, setEndDelimiter, setSelectSequenceNumberQuery, setSequencePreallocationSize, setSequences, setStartDelimiter, setTableQualifier, setTimestampQuery, setUpdateSequenceQuery, toString, usesPlatformDefaultSequence
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

MySQLPlatform

public MySQLPlatform()
Method Detail

buildSelectQueryForIdentity

public ValueReadQuery buildSelectQueryForIdentity()
INTERNAL: Build the identity query for native sequencing.

Overrides:
buildSelectQueryForIdentity in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

buildProcedureCallString

public String buildProcedureCallString(StoredProcedureCall call,
                                       org.eclipse.persistence.internal.sessions.AbstractSession session)
Return the proc syntax for this platform.

Overrides:
buildProcedureCallString in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

computeMaxRowsForSQL

public int computeMaxRowsForSQL(int firstResultIndex,
                                int maxResults)
INTERNAL: Use the JDBC maxResults and firstResultIndex setting to compute a value to use when limiting the results of a query in SQL. These limits tend to be used in two ways. 1. MaxRows is the index of the last row to be returned (like JDBC maxResults) 2. MaxRows is the number of rows to be returned MySQL uses case #2 and therefore the maxResults has to be altered based on the firstResultIndex

Overrides:
computeMaxRowsForSQL in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
Parameters:
readQuery -
firstResultIndex -
maxResults -
See Also:
MySQLPlatform

executeBatch

public int executeBatch(Statement statement,
                        boolean isStatementPrepared)
                 throws SQLException
Internal: This gets called on each batch statement execution Needs to be implemented so that it returns the number of rows successfully modified by this statement for optimistic locking purposes (if useNativeBatchWriting is enabled, and the call uses optimistic locking).

Overrides:
executeBatch in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
Parameters:
isStatementPrepared - - flag is set to true if this statement is prepared
Returns:
- number of rows modified/deleted by this statement
Throws:
SQLException

canBatchWriteWithOptimisticLocking

public boolean canBatchWriteWithOptimisticLocking()
INTERNAL: Supports Batch Writing with Optimistic Locking.


getConstraintDeletionString

public String getConstraintDeletionString()
INTERNAL: Used for constraint deletion.

Overrides:
getConstraintDeletionString in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

getFunctionCallHeader

public String getFunctionCallHeader()
Used for stored function calls.

Overrides:
getFunctionCallHeader in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

getProcedureCallTail

public String getProcedureCallTail()
Used for sp calls.

Overrides:
getProcedureCallTail in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

getSelectForUpdateString

public String getSelectForUpdateString()
INTERNAL: Used for pessimistic locking.

Overrides:
getSelectForUpdateString in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

getTimestampQuery

public ValueReadQuery getTimestampQuery()
INTERNAL: This method returns the query to select the timestamp from the server for MySQL.

Specified by:
getTimestampQuery in interface org.eclipse.persistence.internal.databaseaccess.Platform
Overrides:
getTimestampQuery in class org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform

isMySQL

public boolean isMySQL()
Answers whether platform is MySQL.

Specified by:
isMySQL in interface org.eclipse.persistence.internal.databaseaccess.Platform
Overrides:
isMySQL 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.

Overrides:
printFieldIdentityClause in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
Throws:
ValidationException

shouldUseJDBCOuterJoinSyntax

public boolean shouldUseJDBCOuterJoinSyntax()
INTERNAL: JDBC defines an outer join syntax which many drivers do not support. 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. MySQL supports native sequencing through AUTO_INCREMENT field types.

Overrides:
supportsIdentity in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

supportsGlobalTempTables

public boolean supportsGlobalTempTables()
INTERNAL: MySQL supports temp tables for update-all, delete-all queries.

Overrides:
supportsGlobalTempTables in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

supportsIndividualTableLocking

public boolean supportsIndividualTableLocking()
INTERNAL: Indicates whether locking clause could be selectively applied only to some tables in a ReadQuery. Example: the following locks the rows in SALARY table, doesn't lock the rows in EMPLOYEE table: on Oracle platform (method returns true): SELECT t0.EMP_ID..., t1.SALARY FROM EMPLOYEE t0, SALARY t1 WHERE ... FOR UPDATE t1.SALARY on SQLServer platform (method returns true): SELECT t0.EMP_ID..., t1.SALARY FROM EMPLOYEE t0, SALARY t1 WITH (UPDLOCK) WHERE ...

Overrides:
supportsIndividualTableLocking in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

supportsStoredFunctions

public boolean supportsStoredFunctions()
Overrides:
supportsStoredFunctions in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

supportsAutoConversionToNumericForArithmeticOperations

public boolean supportsAutoConversionToNumericForArithmeticOperations()
Some db allow VARCHAR db field to be used in arithmetic operations automatically converting them to numeric: UPDATE OL_PHONE SET PHONE_ORDER_VARCHAR = (PHONE_ORDER_VARCHAR + 1) WHERE ... SELECT ... WHERE ... t0.MANAGED_ORDER_VARCHAR BETWEEN 1 AND 4 ...

Overrides:
supportsAutoConversionToNumericForArithmeticOperations in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

shouldAlwaysUseTempStorageForModifyAll

public boolean shouldAlwaysUseTempStorageForModifyAll()
INTERNAL: MySQL supports temp tables for update-all, delete-all queries.

Overrides:
shouldAlwaysUseTempStorageForModifyAll in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

shouldPrintStoredProcedureArgumentNameInCall

public boolean shouldPrintStoredProcedureArgumentNameInCall()
INTERNAL: MySQL stored procedure calls do not require the argument name be printed in the call string e.g. call MyStoredProc(?) instead of call MyStoredProc(myvariable = ?)

Overrides:
shouldPrintStoredProcedureArgumentNameInCall in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
Returns:

getIdentifierQuoteCharacter

public String getIdentifierQuoteCharacter()
Deprecated. 

INTERNAL: MySQL uses ' to allow identifier to have spaces.

Overrides:
getIdentifierQuoteCharacter in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
Returns:
The quote character for this platform
See Also:
DatasourcePlatform.getStartDelimiter(), DatasourcePlatform.getEndDelimiter()

getInOutputProcedureToken

public String getInOutputProcedureToken()
INTERNAL: MySQL uses the INOUT keyword for this.

Overrides:
getInOutputProcedureToken in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

getProcedureAsString

public String getProcedureAsString()
MySQL does not use the AS token.

Overrides:
getProcedureAsString in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

shouldPrintOutputTokenAtStart

public boolean shouldPrintOutputTokenAtStart()
INTERNAL: MySQL requires the direction at the start of the argument.

Overrides:
shouldPrintOutputTokenAtStart in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

getProcedureCallHeader

public String getProcedureCallHeader()
INTERNAL: Used for stored procedure calls.

Overrides:
getProcedureCallHeader in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

getProcedureBeginString

public String getProcedureBeginString()
INTERNAL: MySQL requires BEGIN.

Overrides:
getProcedureBeginString in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

getProcedureEndString

public String getProcedureEndString()
INTERNAL: MySQL requires END.

Overrides:
getProcedureEndString in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform

writeUpdateOriginalFromTempTableSql

public void writeUpdateOriginalFromTempTableSql(Writer writer,
                                                org.eclipse.persistence.internal.helper.DatabaseTable table,
                                                Collection pkFields,
                                                Collection assignedFields)
                                         throws IOException
INTERNAL: Writes MySQL specific SQL for accessing temp tables for update-all queries.

Overrides:
writeUpdateOriginalFromTempTableSql in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
Throws:
IOException

writeDeleteFromTargetTableUsingTempTableSql

public void writeDeleteFromTargetTableUsingTempTableSql(Writer writer,
                                                        org.eclipse.persistence.internal.helper.DatabaseTable table,
                                                        org.eclipse.persistence.internal.helper.DatabaseTable targetTable,
                                                        Collection pkFields,
                                                        Collection targetPkFields)
                                                 throws IOException
INTERNAL: Writes MySQL specific SQL for accessing temp tables for delete-all queries.

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

printStoredFunctionReturnKeyWord

public void printStoredFunctionReturnKeyWord(Writer writer)
                                      throws IOException
INTERNAL: Prints return keyword for StoredFunctionDefinition: CREATE FUNCTION StoredFunction_In (P_IN BIGINT) RETURN BIGINT The method was introduced because MySQL requires "RETURNS" instead: CREATE FUNCTION StoredFunction_In (P_IN BIGINT) RETURNS BIGINT

Overrides:
printStoredFunctionReturnKeyWord in class org.eclipse.persistence.internal.databaseaccess.DatabasePlatform
Throws:
IOException