All Implemented Interfaces:
Serializable, Cloneable, CorePlatform<ConversionManager>, Platform
Direct Known Subclasses:
PostgreSQL10Platform

public class PostgreSQLPlatform extends DatabasePlatform

Purpose: Provides Postgres specific behavior.

Responsibilities:

  • Native SQL for Date, Time, & Timestamp.
  • Native sequencing.
  • Mapping of class types to database types for the schema framework.
  • Pessimistic locking.
  • Platform specific operators.
  • LIMIT/OFFSET query syntax for select statements.
Since:
OracleAS TopLink 10g (10.1.3)
See Also:
  • Constructor Details

    • PostgreSQLPlatform

      public PostgreSQLPlatform()
  • Method Details

    • getJDBCType

      public int getJDBCType(Class<?> javaType)
      Return the JDBC type for the Java type. For some reason PostgreSQL does not seem to like the JDBC Blob type (PostgreSQL 8.2).
      Overrides:
      getJDBCType in class DatabasePlatform
    • appendBoolean

      protected void appendBoolean(Boolean bool, Writer writer) throws IOException
      Appends a Boolean value. Refer to : http://www.postgresql.org/docs/8.0/static/datatype-boolean.html In PostgreSQL the following are the values that are value for a boolean field Valid literal values for the "true" state are: TRUE, 't', 'true', 'y', 'yes', '1' Valid literal values for the false" state are : FALSE, 'f', 'false', 'n', 'no', '0' To be consistent with the other data platforms we are using the values '1' and '0' for true and false states of a boolean field.
      Overrides:
      appendBoolean in class DatabasePlatform
      Throws:
      IOException
    • 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 PostGreSQL uses case #2 and therefore the maxResults has to be altered based on the firstResultIndex
      Overrides:
      computeMaxRowsForSQL in class DatabasePlatform
      See Also:
    • initializePlatformOperators

      protected void initializePlatformOperators()
      INTERNAL: Initialize any platform-specific operators
      Overrides:
      initializePlatformOperators in class DatasourcePlatform
    • regexpOperator

      public static ExpressionOperator regexpOperator()
      INTERNAL: Create the ~ operator. REGEXP allows for comparison through regular expression.
    • toNumberOperator

      protected ExpressionOperator toNumberOperator()
      INTERNAL: Postgres to_number has two arguments, as fix format argument.
    • getTimestampQuery

      public ValueReadQuery getTimestampQuery()
      INTERNAL: This method returns the query to select the timestamp from the server for Postgres.
      Specified by:
      getTimestampQuery in interface Platform
      Overrides:
      getTimestampQuery in class DatasourcePlatform
    • getInOutputProcedureToken

      public String getInOutputProcedureToken()
      This method is used to print the output parameter token when stored procedures are called
      Overrides:
      getInOutputProcedureToken in class DatabasePlatform
    • shouldPrintOutputTokenAtStart

      public boolean shouldPrintOutputTokenAtStart()
      This is required in the construction of the stored procedures with output parameters
      Overrides:
      shouldPrintOutputTokenAtStart in class DatabasePlatform
    • shouldPrintStoredProcedureArgumentNameInCall

      public boolean shouldPrintStoredProcedureArgumentNameInCall()
      INTERNAL: Should the variable name of a stored procedure call be printed as part of the procedure call e.g. EXECUTE PROCEDURE MyStoredProc(myvariable = ?) In case of PostgreSQL NO as JDBC driver and DB doesn't support pass parameters by name. It expects, that parameters are passed by index or persistence property <property name="eclipselink.jpa.naming_into_indexed" value="true"/> is used.
      Overrides:
      shouldPrintStoredProcedureArgumentNameInCall in class DatabasePlatform
    • isJDBCExecuteCompliant

      public boolean isJDBCExecuteCompliant()
      Calling a stored procedure query on PostgreSQL with no output parameters always returns true from an execute call regardless if a result set is returned or not. This flag will help avoid throwing a JPA mandated exception on an executeUpdate call (which calls jdbc execute and checks the return value to ensure no results sets are returned (true)). PostgreSQL also doesn't support parameters passed by name in case of stored procedure calls.
      Overrides:
      isJDBCExecuteCompliant in class DatabasePlatform
      See Also:
    • isPostgreSQL

      public boolean isPostgreSQL()
      INTERNAL: Answers whether platform is Postgres.
      Specified by:
      isPostgreSQL in interface Platform
      Overrides:
      isPostgreSQL in class DatasourcePlatform
    • getCreateTempTableSqlSuffix

      protected String getCreateTempTableSqlSuffix()
      INTERNAL:
      Overrides:
      getCreateTempTableSqlSuffix in class DatabasePlatform
    • shouldPrintAliasForUpdate

      public boolean shouldPrintAliasForUpdate()
      INTERNAL: Indicates whether locking OF clause should print alias for field. Example: on Oracle platform (method returns false): SELECT ADDRESS_ID, ... FROM ADDRESS T1 WHERE (T1.ADDRESS_ID = ?) FOR UPDATE OF T1.ADDRESS_ID on Postgres platform (method returns true): SELECT ADDRESS_ID, ... FROM ADDRESS T1 WHERE (T1.ADDRESS_ID = ?) FOR UPDATE OF T1
      Overrides:
      shouldPrintAliasForUpdate in class DatabasePlatform
    • supportsIdentity

      public boolean supportsIdentity()
      INTERNAL: Indicates whether the platform supports identity.
      Overrides:
      supportsIdentity in class DatasourcePlatform
    • buildSelectQueryForIdentity

      public ValueReadQuery buildSelectQueryForIdentity()
      INTERNAL: Returns query used to read back the value generated by Identity. This method is called when identity NativeSequence is connected, the returned query used until the sequence is disconnected. If the platform supportsIdentity then (at least) one of buildSelectQueryForIdentity methods should return non-null query.
      Overrides:
      buildSelectQueryForIdentity in class DatasourcePlatform
    • supportsSequenceObjects

      public boolean supportsSequenceObjects()
      INTERNAL: Indicates whether the platform supports sequence objects.
      Overrides:
      supportsSequenceObjects in class DatasourcePlatform
    • buildSelectQueryForSequenceObject

      public ValueReadQuery buildSelectQueryForSequenceObject(String qualifiedSeqName, Integer size)
      INTERNAL: Returns query used to read value generated by sequence object (like Oracle sequence). This method is called when sequence object NativeSequence is connected, the returned query used until the sequence is disconnected. If the platform supportsSequenceObjects then (at least) one of buildSelectQueryForSequenceObject methods should return non-null query.
      Overrides:
      buildSelectQueryForSequenceObject in class 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 DatabasePlatform
      Throws:
      ValidationException
    • buildFieldTypes

      protected Hashtable<Class<?>,FieldTypeDefinition> buildFieldTypes()
      Description copied from class: DatabasePlatform
      Return the mapping of class types to database types for the schema framework.
      Overrides:
      buildFieldTypes in class DatabasePlatform
    • operatorLocate

      protected ExpressionOperator operatorLocate()
      INTERNAL: Override the default locate operator.
    • operatorLocate2

      protected ExpressionOperator operatorLocate2()
      INTERNAL: Override the default locate operator.
    • supportsLocalTempTables

      public boolean supportsLocalTempTables()
      INTERNAL:
      Overrides:
      supportsLocalTempTables in class DatabasePlatform
    • getCreateTempTableSqlPrefix

      protected String getCreateTempTableSqlPrefix()
      INTERNAL:
      Overrides:
      getCreateTempTableSqlPrefix in class DatabasePlatform
    • getMaxFieldNameSize

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

      public String getProcedureBeginString()
      INTERNAL: Used for sp calls.
      Overrides:
      getProcedureBeginString in class DatabasePlatform
    • getProcedureEndString

      public String getProcedureEndString()
      INTERNAL: Used for sp calls.
      Overrides:
      getProcedureEndString in class DatabasePlatform
    • getProcedureCallHeader

      public String getProcedureCallHeader()
      INTERNAL: Used for sp calls.
      Overrides:
      getProcedureCallHeader in class DatabasePlatform
    • getAssignmentString

      public String getAssignmentString()
      INTERNAL Used for stored function calls.
      Overrides:
      getAssignmentString in class DatabasePlatform
    • getDropCascadeString

      public String getDropCascadeString()
      Allows DROP TABLE to cascade dropping of any dependent constraints if the database supports this option.
      Overrides:
      getDropCascadeString in class DatabasePlatform
    • printFieldTypeSize

      public void printFieldTypeSize(Writer writer, FieldDefinition field, FieldTypeDefinition fieldType, boolean shouldPrintFieldIdentityClause) throws IOException
      Overrides:
      printFieldTypeSize in class DatabasePlatform
      Throws:
      IOException
    • printFieldUnique

      public void printFieldUnique(Writer writer, boolean shouldPrintFieldIdentityClause) throws IOException
      Overrides:
      printFieldUnique in class DatabasePlatform
      Throws:
      IOException
    • 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 DatabasePlatform
    • isAlterSequenceObjectSupported

      public boolean isAlterSequenceObjectSupported()
      INTERNAL: Override this method if the platform supports sequence objects and it's possible to alter sequence object's increment in the database.
      Overrides:
      isAlterSequenceObjectSupported in class DatabasePlatform
    • printSQLSelectStatement

      public void printSQLSelectStatement(DatabaseCall call, ExpressionSQLPrinter printer, SQLSelectStatement statement)
      Print the pagination SQL using Postgres syntax " LIMIT <max> OFFSET <first>".
      Overrides:
      printSQLSelectStatement in class DatabasePlatform
    • writeUpdateOriginalFromTempTableSql

      public void writeUpdateOriginalFromTempTableSql(Writer writer, DatabaseTable table, Collection<DatabaseField> pkFields, Collection<DatabaseField> assignedFields) throws IOException
      INTERNAL: May need to override this method if the platform supports temporary tables and the generated sql doesn't work. Write an sql string for updating the original table from the temporary table. Precondition: supportsTempTables() == true. Precondition: pkFields and assignFields don't intersect.
      Overrides:
      writeUpdateOriginalFromTempTableSql in class 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
    • canBuildCallWithReturning

      public boolean canBuildCallWithReturning()
      INTERNAL: Postgres has a returning clause.
      Overrides:
      canBuildCallWithReturning in class DatabasePlatform
    • buildCallWithReturning

      public DatabaseCall buildCallWithReturning(SQLCall sqlCall, Vector<DatabaseField> returnFields)
      INTERNAL: Uses the returning clause on Postgres.
      Overrides:
      buildCallWithReturning in class DatabasePlatform
    • setNullFromDatabaseField

      protected void setNullFromDatabaseField(DatabaseField databaseField, PreparedStatement statement, int index) throws SQLException
      Overrides:
      setNullFromDatabaseField in class DatabasePlatform
      Throws:
      SQLException
    • setParameterValueInDatabaseCall

      public void setParameterValueInDatabaseCall(Object parameter, PreparedStatement statement, int index, AbstractSession session) throws SQLException
      INTERNAL Set the parameter in the JDBC statement at the given index in case it is a UUID value.
      Overrides:
      setParameterValueInDatabaseCall in class DatabasePlatform
      Parameters:
      parameter - the parameter to set
      statement - target PreparedStatement instance
      index - index of the parameter in the statement
      session - current database session
      Throws:
      SQLException
    • setParameterValueInDatabaseCall

      public void setParameterValueInDatabaseCall(Object parameter, CallableStatement statement, String name, AbstractSession session) throws SQLException
      INTERNAL Set the parameter in the JDBC statement at the given index in case it is a UUID value.
      Overrides:
      setParameterValueInDatabaseCall in class DatabasePlatform
      Parameters:
      parameter - the parameter to set
      statement - target CallableStatement instance
      name - name of the parameter in the statement
      session - current database session
      Throws:
      SQLException