Class PostgreSQLAdapter
- java.lang.Object
-
- org.datanucleus.store.rdbms.adapter.BaseDatastoreAdapter
-
- org.datanucleus.store.rdbms.adapter.PostgreSQLAdapter
-
- All Implemented Interfaces:
DatastoreAdapter
public class PostgreSQLAdapter extends BaseDatastoreAdapter
Provides methods for adapting SQL language elements to the PostgreSQL database.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class org.datanucleus.store.rdbms.adapter.BaseDatastoreAdapter
BaseDatastoreAdapter.ColumnTypeMappings
-
-
Field Summary
Fields Modifier and Type Field Description static String
POSTGRESQL_RESERVED_WORDS
List of Postgresql keywords that aren't in SQL92, SQL99-
Fields inherited from class org.datanucleus.store.rdbms.adapter.BaseDatastoreAdapter
catalogSeparator, datastoreMajorVersion, datastoreMinorVersion, datastoreProductName, datastoreProductVersion, datastoreRevisionVersion, driverMajorVersion, driverMinorVersion, driverName, driverVersion, identifierQuoteString, MAX_IDENTIFIER_LENGTH, maxColumnNameLength, maxConstraintNameLength, maxIndexNameLength, maxTableNameLength, NONRESERVED_WORDS, reservedKeywords, SQL2003_RESERVED_WORDS, SQL92_RESERVED_WORDS, SQL99_RESERVED_WORDS, supportedJdbcTypesById, supportedOptions, unsupportedJdbcTypesById
-
Fields inherited from interface org.datanucleus.store.rdbms.adapter.DatastoreAdapter
ACCESS_PARENTQUERY_IN_SUBQUERY_JOINED, ALTER_TABLE_DROP_CONSTRAINT_SYNTAX, ALTER_TABLE_DROP_FOREIGN_KEY_CONSTRAINT, ANSI_CROSSJOIN_SYNTAX, ANSI_JOIN_SYNTAX, BIT_IS_REALLY_BOOLEAN, BLOB_SET_USING_SETSTRING, BOOLEAN_COMPARISON, CATALOGS_IN_TABLE_DEFINITIONS, CHAR_COLUMNS_PADDED_WITH_SPACES, CHECK_IN_CREATE_STATEMENTS, CHECK_IN_END_CREATE_STATEMENTS, CLOB_SET_USING_SETSTRING, COLUMN_LENGTH_SEMANTICS, CREATE_INDEX_COLUMN_ORDERING, CREATE_INDEXES_BEFORE_FOREIGN_KEYS, CROSSJOIN_ASINNER11_SYNTAX, DATETIME_STORES_MILLISECS, DEFAULT_BEFORE_NULL_IN_COLUMN_OPTIONS, DEFAULT_KEYWORD_IN_COLUMN_OPTIONS, DEFAULT_KEYWORD_WITH_NOT_NULL_IN_COLUMN_OPTIONS, DEFERRED_CONSTRAINTS, DISTINCT_WITH_SELECT_FOR_UPDATE, ESCAPE_EXPRESSION_IN_LIKE_PREDICATE, EXISTS_SYNTAX, FK_DELETE_ACTION_CASCADE, FK_DELETE_ACTION_DEFAULT, FK_DELETE_ACTION_NULL, FK_DELETE_ACTION_RESTRICT, FK_IN_END_CREATE_STATEMENTS, FK_UPDATE_ACTION_CASCADE, FK_UPDATE_ACTION_DEFAULT, FK_UPDATE_ACTION_NULL, FK_UPDATE_ACTION_RESTRICT, GET_GENERATED_KEYS_STATEMENT, GROUP_BY_REQUIRES_ALL_SELECT_PRIMARIES, GROUPING_WITH_SELECT_FOR_UPDATE, HAVING_WITH_SELECT_FOR_UPDATE, HOLD_CURSORS_OVER_COMMIT, IDENTIFIERS_LOWERCASE, IDENTIFIERS_LOWERCASE_QUOTED, IDENTIFIERS_MIXEDCASE, IDENTIFIERS_MIXEDCASE_QUOTED, IDENTIFIERS_MIXEDCASE_QUOTED_SENSITIVE, IDENTIFIERS_MIXEDCASE_SENSITIVE, IDENTIFIERS_UPPERCASE, IDENTIFIERS_UPPERCASE_QUOTED, IDENTITY_COLUMN_TYPE_SPECIFICATION, IDENTITY_COLUMNS, IDENTITY_KEYS_NULL_SPECIFICATION, IDENTITY_PK_IN_CREATE_TABLE_COLUMN_DEF, INCLUDE_ORDERBY_COLS_IN_SELECT, LOCK_ROW_USING_OPTION_AFTER_FROM, LOCK_ROW_USING_OPTION_WITHIN_JOIN, LOCK_ROW_USING_SELECT_FOR_UPDATE, LOCK_ROW_USING_SELECT_FOR_UPDATE_NOWAIT, MULTITABLES_WITH_SELECT_FOR_UPDATE, NATIVE_ENUM_TYPE, NULL_EQUALS_EMPTY_STRING, NULLS_IN_CANDIDATE_KEYS, NULLS_KEYWORD_IN_COLUMN_OPTIONS, OPERATOR_BITWISE_AND, OPERATOR_BITWISE_OR, OPERATOR_BITWISE_XOR, ORDERBY_NULLS_DIRECTIVES, ORDERBY_NULLS_USING_CASE_NULL, ORDERBY_NULLS_USING_COLUMN_IS_NULL, ORDERBY_NULLS_USING_ISNULL, ORDERBY_USING_SELECT_COLUMN_INDEX, ORDERING_WITH_SELECT_FOR_UPDATE, PARAMETER_IN_CASE_IN_UPDATE_CLAUSE, PERSIST_OF_UNASSIGNED_CHAR, PRIMARYKEY_IN_CREATE_STATEMENTS, PROJECTION_IN_TABLE_REFERENCE_JOINS, RAW_PREFIX_LIKE_STATEMENTS, RESULTSET_TYPE_FORWARD_ONLY, RESULTSET_TYPE_SCROLL_INSENSITIVE, RESULTSET_TYPE_SCROLL_SENSITIVE, RIGHT_OUTER_JOIN, SCHEMAS_IN_TABLE_DEFINITIONS, SEQUENCES, SOME_ANY_ALL_SUBQUERY_EXPRESSIONS, STATEMENT_BATCHING, STORED_PROCEDURES, SUBQUERY_IN_HAVING, TX_ISOLATION_NONE, TX_ISOLATION_READ_COMMITTED, TX_ISOLATION_READ_UNCOMMITTED, TX_ISOLATION_REPEATABLE_READ, TX_ISOLATION_SERIALIZABLE, UNION_SYNTAX, UNIQUE_IN_END_CREATE_STATEMENTS, UPDATE_DELETE_STATEMENT_ALLOW_TABLE_ALIAS_IN_WHERE_CLAUSE, UPDATE_STATEMENT_ALLOW_TABLE_ALIAS_IN_SET_CLAUSE, USE_UNION_ALL, VALUE_GENERATION_UUID_STRING, VIEWS
-
-
Constructor Summary
Constructors Constructor Description PostgreSQLAdapter(DatabaseMetaData metadata)
Constructor.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description String
getAddColumnStatement(Table table, Column col)
Accessor for the SQL statement to add a column to a table.String
getAddPrimaryKeyStatement(PrimaryKey pk, IdentifierFactory factory)
PostgreSQL allows specification of PRIMARY KEY in the CREATE TABLE, so we need nothing here.String
getCreateIndexStatement(Index idx, IdentifierFactory factory)
Returns the appropriate DDL to create an index.String
getDropDatabaseStatement(String catalogName, String schemaName)
Method to return the statement necessary to drop a database with this RDBMS.String
getDropTableStatement(Table table)
Accessor for the statement for dropping a table.String
getEscapePatternExpression()
The character for escaping patterns.String
getIdentityKeyword(org.datanucleus.store.StoreManager storeMgr)
Accessor for the auto-increment keyword for generating DDLs (CREATE TABLEs...).String
getIdentityLastValueStmt(Table table, String columnName)
Accessor for the autoincrement sql access statement for this datastore.String
getInsertStatementForNoColumns(Table table)
Method to return the INSERT statement to use when inserting into a table and we dont want to specify columns.String
getPreferredDefaultSQLTypeForJDBCType(org.datanucleus.metadata.JdbcType jdbcType)
Way for a DatastoreAdapter to specify a preferred default SQL type for a JDBC type (when there are multiple).String
getRangeByLimitEndOfStatementClause(long offset, long count, boolean hasOrdering)
Method to return the SQL to append to the WHERE clause of a SELECT statement to handle restriction of ranges using the LIMUT keyword.String
getSequenceCreateStmt(String sequenceName, Integer min, Integer max, Integer start, Integer increment, Integer cacheSize)
Accessor for the sequence statement to create the sequence.String
getSequenceNextStmt(String sequenceName)
Accessor for the statement for getting the next id from the sequence for this datastore.Class
getSQLMethodClass(String className, String methodName, org.datanucleus.ClassLoaderResolver clr)
Accessor for the SQLMethod class for the query invocation of specified class + method name (if available for this datastore).String
getVendorID()
Accessor for the vendor id.void
initialiseTypes(org.datanucleus.store.schema.StoreSchemaHandler handler, org.datanucleus.store.connection.ManagedConnection mconn)
Initialise the types for this datastore.boolean
isStatementCancel(SQLException sqle)
return whether this exception represents a cancelled statement.protected void
loadColumnMappings(org.datanucleus.plugin.PluginManager mgr, org.datanucleus.ClassLoaderResolver clr)
Load all datastore mappings for this RDBMS database.ForeignKeyInfo
newFKInfo(ResultSet rs)
Method to return ForeignKeyInfo for the current row of the ResultSet which will have been obtained from a call to DatabaseMetaData.getImportedKeys() or DatabaseMetaData.getExportedKeys().RDBMSColumnInfo
newRDBMSColumnInfo(ResultSet rs)
Method to create a column info for the current row.SQLTypeInfo
newSQLTypeInfo(ResultSet rs)
Create a new SQL type info from the current row of the passed ResultSet.boolean
sequenceExists(Connection conn, String catalogName, String schemaName, String seqName)
Convenience method to return whether the specified sequence already exists.boolean
supportsQueryFetchSize(int size)
Whether the datastore will support setting the query fetch size to the supplied value.-
Methods inherited from class org.datanucleus.store.rdbms.adapter.BaseDatastoreAdapter
addSQLTypeForJDBCType, deregisterColumnMappingsForJDBCType, getAdapterTime, getAddCandidateKeyStatement, getAddForeignKeyStatement, getCatalogName, getCatalogSeparator, getCheckConstraintForValues, getColumnMappingClass, getColumns, getContinuationString, getCreateDatabaseStatement, getCreateTableStatement, getDatastoreDateStatement, getDatastoreDriverName, getDatastoreDriverVersion, getDatastoreIdentifierMaxLength, getDatastoreProductName, getDatastoreProductVersion, getDefaultSqlTypeForJavaType, getDeleteTableStatement, getDriverMajorVersion, getDriverMinorVersion, getDropViewStatement, getEscapeCharacter, getExistingIndexes, getIdentifierQuoteString, getIdentityJavaTypeForType, getJDBCTypeForName, getMappingManager, getMaxForeignKeys, getMaxIndexes, getMiliseconds, getNameForJDBCType, getNewUUIDFunction, getNumericConversionFunction, getOrderString, getPatternExpressionAnyCharacter, getPatternExpressionZeroMoreCharacters, getRangeByRowNumberColumn, getRangeByRowNumberColumn2, getRequiredTransactionIsolationLevel, getReservedWords, getSchemaName, getSelectForUpdateText, getSelectNewUUIDStmt, getSelectWithLockOption, getSQLOperationClass, getSQLTypeInfoForJdbcType, getSupportedOptions, getSurrogateForEmptyStrings, getTime, getTransactionIsolationForSchemaCreation, getUnlimitedLengthPrecisionValue, getUpdateTableStatement, initialise, initialiseDatastore, isIdentityFieldDataType, isReservedKeyword, isStatementTimeout, isValidPrimaryKeyType, registerColumnMapping, registerColumnMapping, supportsOption, supportsTransactionIsolation, toString, validToIndexMapping, validToSelectMappingInStatement
-
-
-
-
Field Detail
-
POSTGRESQL_RESERVED_WORDS
public static final String POSTGRESQL_RESERVED_WORDS
List of Postgresql keywords that aren't in SQL92, SQL99- See Also:
- Constant Field Values
-
-
Constructor Detail
-
PostgreSQLAdapter
public PostgreSQLAdapter(DatabaseMetaData metadata)
Constructor.- Parameters:
metadata
- MetaData from the JDBC driver
-
-
Method Detail
-
initialiseTypes
public void initialiseTypes(org.datanucleus.store.schema.StoreSchemaHandler handler, org.datanucleus.store.connection.ManagedConnection mconn)
Initialise the types for this datastore.- Specified by:
initialiseTypes
in interfaceDatastoreAdapter
- Overrides:
initialiseTypes
in classBaseDatastoreAdapter
- Parameters:
handler
- SchemaHandler that we initialise the types formconn
- Managed connection to use
-
getVendorID
public String getVendorID()
Accessor for the vendor id.- Specified by:
getVendorID
in interfaceDatastoreAdapter
- Overrides:
getVendorID
in classBaseDatastoreAdapter
- Returns:
- The vendor id.
-
getPreferredDefaultSQLTypeForJDBCType
public String getPreferredDefaultSQLTypeForJDBCType(org.datanucleus.metadata.JdbcType jdbcType)
Description copied from interface:DatastoreAdapter
Way for a DatastoreAdapter to specify a preferred default SQL type for a JDBC type (when there are multiple).- Specified by:
getPreferredDefaultSQLTypeForJDBCType
in interfaceDatastoreAdapter
- Overrides:
getPreferredDefaultSQLTypeForJDBCType
in classBaseDatastoreAdapter
- Parameters:
jdbcType
- The JDBC type- Returns:
- The SQL type preferred
-
newSQLTypeInfo
public SQLTypeInfo newSQLTypeInfo(ResultSet rs)
Description copied from interface:DatastoreAdapter
Create a new SQL type info from the current row of the passed ResultSet. Allows an adapter to override particular types where the JDBC driver is known to be buggy.- Specified by:
newSQLTypeInfo
in interfaceDatastoreAdapter
- Overrides:
newSQLTypeInfo
in classBaseDatastoreAdapter
- Parameters:
rs
- ResultSet- Returns:
- The SQL type info
-
newRDBMSColumnInfo
public RDBMSColumnInfo newRDBMSColumnInfo(ResultSet rs)
Method to create a column info for the current row. Overrides the dataType/columnSize/decimalDigits to cater for Postgresql particularities.- Specified by:
newRDBMSColumnInfo
in interfaceDatastoreAdapter
- Overrides:
newRDBMSColumnInfo
in classBaseDatastoreAdapter
- Parameters:
rs
- ResultSet from DatabaseMetaData.getColumns()- Returns:
- column info
-
newFKInfo
public ForeignKeyInfo newFKInfo(ResultSet rs)
Method to return ForeignKeyInfo for the current row of the ResultSet which will have been obtained from a call to DatabaseMetaData.getImportedKeys() or DatabaseMetaData.getExportedKeys().- Specified by:
newFKInfo
in interfaceDatastoreAdapter
- Overrides:
newFKInfo
in classBaseDatastoreAdapter
- Parameters:
rs
- The result set returned from DatabaseMetaData.get??portedKeys()- Returns:
- The foreign key info
-
getDropDatabaseStatement
public String getDropDatabaseStatement(String catalogName, String schemaName)
Description copied from interface:DatastoreAdapter
Method to return the statement necessary to drop a database with this RDBMS. Note that some RDBMS don't support this.- Specified by:
getDropDatabaseStatement
in interfaceDatastoreAdapter
- Overrides:
getDropDatabaseStatement
in classBaseDatastoreAdapter
- Parameters:
catalogName
- Name of the catalogschemaName
- Name of the schema- Returns:
- The DDL statement
-
getAddColumnStatement
public String getAddColumnStatement(Table table, Column col)
Accessor for the SQL statement to add a column to a table.- Specified by:
getAddColumnStatement
in interfaceDatastoreAdapter
- Overrides:
getAddColumnStatement
in classBaseDatastoreAdapter
- Parameters:
table
- The tablecol
- The column- Returns:
- The SQL necessary to add the column
-
getInsertStatementForNoColumns
public String getInsertStatementForNoColumns(Table table)
Method to return the INSERT statement to use when inserting into a table and we dont want to specify columns. This is the case when we have a single column in the table and that column is autoincrement/identity (and so is assigned automatically in the datastore). Postgresql expects something likeINSERT INTO tbl VALUES(DEFAULT)
- Specified by:
getInsertStatementForNoColumns
in interfaceDatastoreAdapter
- Overrides:
getInsertStatementForNoColumns
in classBaseDatastoreAdapter
- Parameters:
table
- The table- Returns:
- The statement for the INSERT
-
getAddPrimaryKeyStatement
public String getAddPrimaryKeyStatement(PrimaryKey pk, IdentifierFactory factory)
PostgreSQL allows specification of PRIMARY KEY in the CREATE TABLE, so we need nothing here.- Specified by:
getAddPrimaryKeyStatement
in interfaceDatastoreAdapter
- Overrides:
getAddPrimaryKeyStatement
in classBaseDatastoreAdapter
- Parameters:
pk
- An object describing the primary key.factory
- Identifier factory- Returns:
- The PK statement
-
getDropTableStatement
public String getDropTableStatement(Table table)
Accessor for the statement for dropping a table. PostgreSQL has supported the DROP TABLE tbl-name CASCADE since 7.3.- Specified by:
getDropTableStatement
in interfaceDatastoreAdapter
- Overrides:
getDropTableStatement
in classBaseDatastoreAdapter
- Parameters:
table
- The table to drop.- Returns:
- The statement for dropping a table.
-
getCreateIndexStatement
public String getCreateIndexStatement(Index idx, IdentifierFactory factory)
Returns the appropriate DDL to create an index. Overrides the superclass variant since Postgresql doesn't support having index names specified in a particular schema (i.e "{schema}.{indexName}").- Specified by:
getCreateIndexStatement
in interfaceDatastoreAdapter
- Overrides:
getCreateIndexStatement
in classBaseDatastoreAdapter
- Parameters:
idx
- An object describing the index.factory
- Identifier factory- Returns:
- The text of the SQL statement.
-
getIdentityLastValueStmt
public String getIdentityLastValueStmt(Table table, String columnName)
Accessor for the autoincrement sql access statement for this datastore.- Specified by:
getIdentityLastValueStmt
in interfaceDatastoreAdapter
- Overrides:
getIdentityLastValueStmt
in classBaseDatastoreAdapter
- Parameters:
table
- Table that the autoincrement is forcolumnName
- Name of the column that the autoincrement is for- Returns:
- The statement for getting the latest auto-increment key
-
getIdentityKeyword
public String getIdentityKeyword(org.datanucleus.store.StoreManager storeMgr)
Accessor for the auto-increment keyword for generating DDLs (CREATE TABLEs...).- Specified by:
getIdentityKeyword
in interfaceDatastoreAdapter
- Overrides:
getIdentityKeyword
in classBaseDatastoreAdapter
- Parameters:
storeMgr
- The Store Manager- Returns:
- The keyword for a column using auto-increment
-
sequenceExists
public boolean sequenceExists(Connection conn, String catalogName, String schemaName, String seqName)
Description copied from interface:DatastoreAdapter
Convenience method to return whether the specified sequence already exists.- Specified by:
sequenceExists
in interfaceDatastoreAdapter
- Overrides:
sequenceExists
in classBaseDatastoreAdapter
- Parameters:
conn
- Connection to use for checkingcatalogName
- Catalog nameschemaName
- Schema nameseqName
- Name of the sequence- Returns:
- Whether it exists
-
getSequenceCreateStmt
public String getSequenceCreateStmt(String sequenceName, Integer min, Integer max, Integer start, Integer increment, Integer cacheSize)
Accessor for the sequence statement to create the sequence.- Specified by:
getSequenceCreateStmt
in interfaceDatastoreAdapter
- Overrides:
getSequenceCreateStmt
in classBaseDatastoreAdapter
- Parameters:
sequenceName
- Name of the sequencemin
- Minimum value for the sequencemax
- Maximum value for the sequencestart
- Start value for the sequenceincrement
- Increment value for the sequencecacheSize
- Cache size for the sequence- Returns:
- The statement for getting the next id from the sequence
-
getSequenceNextStmt
public String getSequenceNextStmt(String sequenceName)
Accessor for the statement for getting the next id from the sequence for this datastore.- Specified by:
getSequenceNextStmt
in interfaceDatastoreAdapter
- Overrides:
getSequenceNextStmt
in classBaseDatastoreAdapter
- Parameters:
sequenceName
- Name of the sequence- Returns:
- The statement for getting the next id for the sequence
-
supportsQueryFetchSize
public boolean supportsQueryFetchSize(int size)
Whether the datastore will support setting the query fetch size to the supplied value.- Specified by:
supportsQueryFetchSize
in interfaceDatastoreAdapter
- Overrides:
supportsQueryFetchSize
in classBaseDatastoreAdapter
- Parameters:
size
- The value to set to- Returns:
- Whether it is supported.
-
getRangeByLimitEndOfStatementClause
public String getRangeByLimitEndOfStatementClause(long offset, long count, boolean hasOrdering)
Method to return the SQL to append to the WHERE clause of a SELECT statement to handle restriction of ranges using the LIMUT keyword.- Specified by:
getRangeByLimitEndOfStatementClause
in interfaceDatastoreAdapter
- Overrides:
getRangeByLimitEndOfStatementClause
in classBaseDatastoreAdapter
- Parameters:
offset
- The offset to return fromcount
- The number of items to returnhasOrdering
- Whether ordering is present- Returns:
- The SQL to append to allow for ranges using LIMIT.
-
getEscapePatternExpression
public String getEscapePatternExpression()
The character for escaping patterns.- Specified by:
getEscapePatternExpression
in interfaceDatastoreAdapter
- Overrides:
getEscapePatternExpression
in classBaseDatastoreAdapter
- Returns:
- Escape character(s)
-
isStatementCancel
public boolean isStatementCancel(SQLException sqle)
return whether this exception represents a cancelled statement.- Specified by:
isStatementCancel
in interfaceDatastoreAdapter
- Overrides:
isStatementCancel
in classBaseDatastoreAdapter
- Parameters:
sqle
- the exception- Returns:
- whether it is a cancel
-
getSQLMethodClass
public Class getSQLMethodClass(String className, String methodName, org.datanucleus.ClassLoaderResolver clr)
Description copied from interface:DatastoreAdapter
Accessor for the SQLMethod class for the query invocation of specified class + method name (if available for this datastore).- Specified by:
getSQLMethodClass
in interfaceDatastoreAdapter
- Overrides:
getSQLMethodClass
in classBaseDatastoreAdapter
- Parameters:
className
- Name of the class (or null if this is a STATIC method)methodName
- Method nameclr
- ClassLoader resolver, in case className is a subclass of a supported type- Returns:
- The SQLMethod class (or null if not defined for this datastore).
-
loadColumnMappings
protected void loadColumnMappings(org.datanucleus.plugin.PluginManager mgr, org.datanucleus.ClassLoaderResolver clr)
Load all datastore mappings for this RDBMS database.- Overrides:
loadColumnMappings
in classBaseDatastoreAdapter
- Parameters:
mgr
- the PluginManagerclr
- the ClassLoaderResolver
-
-