Package org.hibernate.dialect
Class PostgreSQLDialect
java.lang.Object
org.hibernate.dialect.Dialect
org.hibernate.dialect.PostgreSQLDialect
- Direct Known Subclasses:
PostgresPlusDialect
An SQL dialect for Postgres
For discussion of BLOB support in Postgres, as of 8.4, have a peek at
http://jdbc.postgresql.org/documentation/84/binary-data.html.
For the effects in regards to Hibernate see http://in.relation.to/15492.lace
-
Field Summary
Fields inherited from class org.hibernate.dialect.Dialect
CLOSED_QUOTE, DEFAULT_BATCH_SIZE, NO_BATCH, QUOTE -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionbooleanANSI SQL defines the LIMIT clause to be in the form LIMIT offset, limit.booleanDo we need to drop constraints before dropping tables in this dialect?The syntax used to add a column to a table (optional).Completely optional cascading drop clausegetCreateSequenceString(String sequenceName) Typically dialects which support sequences can create a sequence with a single command.protected StringgetCreateSequenceString(String sequenceName, int initialValue, int incrementSize) Overloaded form ofDialect.getCreateSequenceString(String), additionally taking the initial value and increment size to be applied to the sequence definition.Get any fragments needing to be postfixed to the command for temporary table creation.Command used to create a temporary table.Retrieve the command used to retrieve the current timestamp from the database.getDropSequenceString(String sequenceName) Typically dialects which support sequences can drop a sequence with a single command.Get the string to append to SELECT statements to acquire locks for this dialect.getForUpdateString(String aliases) Get the FOR UPDATE OF column_list fragment appropriate for this dialect given the aliases of the columns to be write locked.getIdentityColumnString(int type) The syntax used during DDL to define a column as being an IDENTITY of a particular type.getIdentitySelectString(String table, String column, int type) Get the select command to use to retrieve the last generated IDENTITY value for a particular tablegetLimitString(String sql, boolean hasOffset) Apply s limit clause to the query.The class (which implementsIdentifierGenerator) which acts as this dialects native generation strategy.The fragment used to insert a row without specifying any column values.Get the select command used retrieve the names of all sequences.getReadLockString(int timeout) Get the string to append to SELECT statements to acquire WRITE locks for this dialect.Given a callable statement previously processed byDialect.registerResultSetOutParameter(java.sql.CallableStatement, int), extract theResultSetfrom the OUT parameter.getSelectClauseNullString(int sqlType) Workaround for postgres bug #1453getSelectSequenceNextValString(String sequenceName) Generate the select expression fragment that will retrieve the next value of a sequence as part of another (typically DML) statement.getSequenceNextValString(String sequenceName) Generate the appropriate select statement to to retrieve the next value of a sequence.getWriteLockString(int timeout) Get the string to append to SELECT statements to acquire WRITE locks for this dialect.booleanWhether this dialect have an Identity clause added to the data type or a completely separate identity data typebooleanShould the value returned byDialect.getCurrentTimestampSelectString()be treated as callable.intregisterResultSetOutParameter(CallableStatement statement, int col) Registers an OUT parameter which will be returning aResultSet.booleanbooleanDoes this dialect support a way to retrieve the database's current timestamp value?booleanDoes this dialect support empty IN lists?booleanExpected LOB usage pattern is such that I can perform an insert via prepared statement with a parameter binding for a LOB value without crazy casting to JDBC driver implementation-specific classes...booleanDoes this dialect support identity column key generation?booleanDoes this dialect support some form of limiting query results via a SQL clause?booleanDoes the dialect support propagating changes to LOB values back to the database? Talking about mutating the internal value of the locator as opposed to supplying a new locator instance...booleanDoes this dialect support FOR UPDATE in conjunction with outer joined rows?booleanDoes this dialect support "pooled" sequences.booleanDoes this dialect support sequences?booleanDoes this dialect support temporary tables?booleanDoes this dialect support `count(distinct a,b)`?booleanIs it supported to materialize a LOB locator outside the transaction in which it was created?booleanDoes this dialect support UNION ALL, which is generally a faster variant of UNION?toBooleanValueString(boolean bool) The SQL literal value to which this database maps boolean values.booleanShould LOBs (both BLOB and CLOB) be bound using stream operations (i.e.Methods inherited from class org.hibernate.dialect.Dialect
addTypeOverride, appendIdentitySelectToInsert, appendLockHint, applyLocksToSql, areStringComparisonsCaseInsensitive, bindLimitParametersFirst, buildSQLExceptionConverter, closeQuote, convertToFirstRowValue, createCaseFragment, createOuterJoinFragment, doesReadCommittedCauseWritersToBlockReaders, doesRepeatableReadCauseReadersToBlockWriters, dropTemporaryTableAfterUse, forceLimitUsage, forUpdateOfColumns, generateTemporaryTableName, getAddForeignKeyConstraintString, getAddPrimaryKeyConstraintString, getCastTypeName, getColumnAliasExtractor, getColumnComment, getCreateMultisetTableString, getCreateSequenceStrings, getCreateSequenceStrings, getCreateTableString, getCrossJoinSeparator, getCurrentTimestampSQLFunctionName, getDefaultProperties, getDialect, getDialect, getDropForeignKeyString, getDropSequenceStrings, getDropTemporaryTableString, getForUpdateNowaitString, getForUpdateNowaitString, getForUpdateString, getForUpdateString, getForUpdateString, getFunctions, getHibernateTypeName, getHibernateTypeName, getIdentityColumnString, getIdentityInsertString, getIdentitySelectString, getKeywords, getLimitString, getLockingStrategy, getLowercaseFunction, getMaxAliasLength, getNullColumnString, getSelectGUIDString, getTableComment, getTableTypeString, getTypeName, getTypeName, getTypeOverrides, hasAlterTable, hasSelfReferentialForeignKeyBug, isLockTimeoutParameterized, openQuote, performTemporaryTableDDLInIsolation, qualifyIndexName, quote, registerColumnType, registerColumnType, registerFunction, registerHibernateType, registerHibernateType, registerKeyword, replaceResultVariableInOrderByClauseWithPosition, requiresCastingOfParametersInSelectClause, supportsBindAsCallableArgument, supportsCascadeDelete, supportsCircularCascadeDeleteConstraints, supportsColumnCheck, supportsExistsInSelect, supportsIfExistsAfterTableName, supportsIfExistsBeforeTableName, supportsInsertSelectIdentity, supportsLimitOffset, supportsLockTimeouts, supportsNotNullUnique, supportsParametersInInsertSelect, supportsResultSetPositionQueryMethodsOnForwardOnlyCursor, supportsRowValueConstructorSyntax, supportsRowValueConstructorSyntaxInInList, supportsSubqueryOnMutatingTable, supportsSubselectAsInPredicateLHS, supportsTableCheck, supportsTupleCounts, supportsUnique, supportsUniqueConstraintInCreateAlterTable, supportsVariableLimit, toString, transformSelectString, useMaxForLimit
-
Constructor Details
-
PostgreSQLDialect
public PostgreSQLDialect()
-
-
Method Details
-
getAddColumnString
Description copied from class:DialectThe syntax used to add a column to a table (optional).- Overrides:
getAddColumnStringin classDialect- Returns:
- The "add column" fragment.
-
getSequenceNextValString
Description copied from class:DialectGenerate the appropriate select statement to to retrieve the next value of a sequence. This should be a "stand alone" select statement.- Overrides:
getSequenceNextValStringin classDialect- Parameters:
sequenceName- the name of the sequence- Returns:
- String The "nextval" select string.
-
getSelectSequenceNextValString
Description copied from class:DialectGenerate the select expression fragment that will retrieve the next value of a sequence as part of another (typically DML) statement. This differs fromDialect.getSequenceNextValString(String)in that this should return an expression usable within another statement.- Overrides:
getSelectSequenceNextValStringin classDialect- Parameters:
sequenceName- the name of the sequence- Returns:
- The "nextval" fragment.
-
getCreateSequenceString
Description copied from class:DialectTypically dialects which support sequences can create a sequence with a single command. This is convenience form ofDialect.getCreateSequenceStrings(java.lang.String)to help facilitate that. Dialects which support sequences and can create a sequence in a single command need *only* override this method. Dialects which support sequences but require multiple commands to create a sequence should instead overrideDialect.getCreateSequenceStrings(java.lang.String).- Overrides:
getCreateSequenceStringin classDialect- Parameters:
sequenceName- The name of the sequence- Returns:
- The sequence creation command
-
getDropSequenceString
Description copied from class:DialectTypically dialects which support sequences can drop a sequence with a single command. This is convenience form ofDialect.getDropSequenceStrings(java.lang.String)to help facilitate that. Dialects which support sequences and can drop a sequence in a single command need *only* override this method. Dialects which support sequences but require multiple commands to drop a sequence should instead overrideDialect.getDropSequenceStrings(java.lang.String).- Overrides:
getDropSequenceStringin classDialect- Parameters:
sequenceName- The name of the sequence- Returns:
- The sequence drop commands
-
getCascadeConstraintsString
Description copied from class:DialectCompletely optional cascading drop clause- Overrides:
getCascadeConstraintsStringin classDialect- Returns:
- String
-
dropConstraints
public boolean dropConstraints()Description copied from class:DialectDo we need to drop constraints before dropping tables in this dialect?- Overrides:
dropConstraintsin classDialect- Returns:
- True if constraints must be dropped prior to dropping the table; false otherwise.
-
supportsSequences
public boolean supportsSequences()Description copied from class:DialectDoes this dialect support sequences?- Overrides:
supportsSequencesin classDialect- Returns:
- True if sequences supported; false otherwise.
-
getQuerySequencesString
Description copied from class:DialectGet the select command used retrieve the names of all sequences.- Overrides:
getQuerySequencesStringin classDialect- Returns:
- The select command; or null if sequences are not supported.
- See Also:
-
supportsLimit
public boolean supportsLimit()Description copied from class:DialectDoes this dialect support some form of limiting query results via a SQL clause?- Overrides:
supportsLimitin classDialect- Returns:
- True if this dialect supports some form of LIMIT.
-
getLimitString
Description copied from class:DialectApply s limit clause to the query. Typically dialects utilizevariablelimit clauses when they support limits. Thus, when building the select command we do not actually need to know the limit or the offest since we will just be using placeholders. Here we do still pass along whether or not an offset was specified so that dialects not supporting offsets can generate proper exceptions. In general, dialects will override one or the other of this method andDialect.getLimitString(String, int, int).- Overrides:
getLimitStringin classDialect- Parameters:
sql- The query to which to apply the limit.hasOffset- Is the query requesting an offset?- Returns:
- the modified SQL
-
bindLimitParametersInReverseOrder
public boolean bindLimitParametersInReverseOrder()Description copied from class:DialectANSI SQL defines the LIMIT clause to be in the form LIMIT offset, limit. Does this dialect require us to bind the parameters in reverse order?- Overrides:
bindLimitParametersInReverseOrderin classDialect- Returns:
- true if the correct order is limit, offset
-
supportsIdentityColumns
public boolean supportsIdentityColumns()Description copied from class:DialectDoes this dialect support identity column key generation?- Overrides:
supportsIdentityColumnsin classDialect- Returns:
- True if IDENTITY columns are supported; false otherwise.
-
getForUpdateString
Description copied from class:DialectGet the FOR UPDATE OF column_list fragment appropriate for this dialect given the aliases of the columns to be write locked.- Overrides:
getForUpdateStringin classDialect- Parameters:
aliases- The columns to be write locked.- Returns:
- The appropriate FOR UPDATE OF column_list clause string.
-
getIdentitySelectString
Description copied from class:DialectGet the select command to use to retrieve the last generated IDENTITY value for a particular table- Overrides:
getIdentitySelectStringin classDialect- Parameters:
table- The table into which the insert was donecolumn- The PK column.type- TheTypestype code.- Returns:
- The appropriate select command
-
getIdentityColumnString
Description copied from class:DialectThe syntax used during DDL to define a column as being an IDENTITY of a particular type.- Overrides:
getIdentityColumnStringin classDialect- Parameters:
type- TheTypestype code.- Returns:
- The appropriate DDL fragment.
-
hasDataTypeInIdentityColumn
public boolean hasDataTypeInIdentityColumn()Description copied from class:DialectWhether this dialect have an Identity clause added to the data type or a completely separate identity data type- Overrides:
hasDataTypeInIdentityColumnin classDialect- Returns:
- boolean
-
getNoColumnsInsertString
Description copied from class:DialectThe fragment used to insert a row without specifying any column values. This is not possible on some databases.- Overrides:
getNoColumnsInsertStringin classDialect- Returns:
- The appropriate empty values clause.
-
getNativeIdentifierGeneratorClass
Description copied from class:DialectThe class (which implementsIdentifierGenerator) which acts as this dialects native generation strategy. Comes into play whenever the user specifies the native generator.- Overrides:
getNativeIdentifierGeneratorClassin classDialect- Returns:
- The native generator class.
-
supportsOuterJoinForUpdate
public boolean supportsOuterJoinForUpdate()Description copied from class:DialectDoes this dialect support FOR UPDATE in conjunction with outer joined rows?- Overrides:
supportsOuterJoinForUpdatein classDialect- Returns:
- True if outer joined rows can be locked via FOR UPDATE.
-
useInputStreamToInsertBlob
public boolean useInputStreamToInsertBlob()Description copied from class:DialectShould LOBs (both BLOB and CLOB) be bound using stream operations (i.e.PreparedStatement.setBinaryStream(int, java.io.InputStream, int)).- Overrides:
useInputStreamToInsertBlobin classDialect- Returns:
- True if BLOBs and CLOBs should be bound using stream operations.
-
supportsUnionAll
public boolean supportsUnionAll()Description copied from class:DialectDoes this dialect support UNION ALL, which is generally a faster variant of UNION?- Overrides:
supportsUnionAllin classDialect- Returns:
- True if UNION ALL is supported; false otherwise.
-
getSelectClauseNullString
Workaround for postgres bug #1453- Overrides:
getSelectClauseNullStringin classDialect- Parameters:
sqlType- TheTypestype code.- Returns:
- The appropriate select clause value fragment.
-
supportsCommentOn
public boolean supportsCommentOn()- Overrides:
supportsCommentOnin classDialect
-
supportsTemporaryTables
public boolean supportsTemporaryTables()Description copied from class:DialectDoes this dialect support temporary tables?- Overrides:
supportsTemporaryTablesin classDialect- Returns:
- True if temp tables are supported; false otherwise.
-
getCreateTemporaryTableString
Description copied from class:DialectCommand used to create a temporary table.- Overrides:
getCreateTemporaryTableStringin classDialect- Returns:
- The command used to create a temporary table.
-
getCreateTemporaryTablePostfix
Description copied from class:DialectGet any fragments needing to be postfixed to the command for temporary table creation.- Overrides:
getCreateTemporaryTablePostfixin classDialect- Returns:
- Any required postfix.
-
supportsCurrentTimestampSelection
public boolean supportsCurrentTimestampSelection()Description copied from class:DialectDoes this dialect support a way to retrieve the database's current timestamp value?- Overrides:
supportsCurrentTimestampSelectionin classDialect- Returns:
- True if the current timestamp can be retrieved; false otherwise.
-
isCurrentTimestampSelectStringCallable
public boolean isCurrentTimestampSelectStringCallable()Description copied from class:DialectShould the value returned byDialect.getCurrentTimestampSelectString()be treated as callable. Typically this indicates that JDBC escape syntax is being used...- Overrides:
isCurrentTimestampSelectStringCallablein classDialect- Returns:
- True if the
Dialect.getCurrentTimestampSelectString()return is callable; false otherwise.
-
getCurrentTimestampSelectString
Description copied from class:DialectRetrieve the command used to retrieve the current timestamp from the database.- Overrides:
getCurrentTimestampSelectStringin classDialect- Returns:
- The command.
-
supportsTupleDistinctCounts
public boolean supportsTupleDistinctCounts()Description copied from class:DialectDoes this dialect support `count(distinct a,b)`?- Overrides:
supportsTupleDistinctCountsin classDialect- Returns:
- True if the database supports counting disintct tuples; false otherwise.
-
toBooleanValueString
Description copied from class:DialectThe SQL literal value to which this database maps boolean values.- Overrides:
toBooleanValueStringin classDialect- Parameters:
bool- The boolean value- Returns:
- The appropriate SQL literal.
-
getViolatedConstraintNameExtracter
- Overrides:
getViolatedConstraintNameExtracterin classDialect
-
registerResultSetOutParameter
Description copied from class:DialectRegisters an OUT parameter which will be returning aResultSet. How this is accomplished varies greatly from DB to DB, hence its inclusion (along withDialect.getResultSet(java.sql.CallableStatement)) here.- Overrides:
registerResultSetOutParameterin classDialect- Parameters:
statement- The callable statement.col- The bind position at which to register the OUT param.- Returns:
- The number of (contiguous) bind positions used.
- Throws:
SQLException- Indicates problems registering the OUT param.
-
getResultSet
Description copied from class:DialectGiven a callable statement previously processed byDialect.registerResultSetOutParameter(java.sql.CallableStatement, int), extract theResultSetfrom the OUT parameter.- Overrides:
getResultSetin classDialect- Parameters:
ps- The callable statement.- Returns:
- The extracted result set.
- Throws:
SQLException- Indicates problems extracting the result set.
-
supportsPooledSequences
public boolean supportsPooledSequences()Description copied from class:DialectDoes this dialect support "pooled" sequences. Not aware of a better name for this. Essentially can we specify the initial and increment values?- Overrides:
supportsPooledSequencesin classDialect- Returns:
- True if such "pooled" sequences are supported; false otherwise.
- See Also:
-
getCreateSequenceString
Description copied from class:DialectOverloaded form ofDialect.getCreateSequenceString(String), additionally taking the initial value and increment size to be applied to the sequence definition. The default definition is to suffixDialect.getCreateSequenceString(String)with the string: " start with {initialValue} increment by {incrementSize}" where {initialValue} and {incrementSize} are replacement placeholders. Generally dialects should only need to override this method if different key phrases are used to apply the allocation information.- Overrides:
getCreateSequenceStringin classDialect- Parameters:
sequenceName- The name of the sequenceinitialValue- The initial value to apply to 'create sequence' statementincrementSize- The increment value to apply to 'create sequence' statement- Returns:
- The sequence creation command
-
supportsEmptyInList
public boolean supportsEmptyInList()Description copied from class:DialectDoes this dialect support empty IN lists? For example, is [where XYZ in ()] a supported construct?- Overrides:
supportsEmptyInListin classDialect- Returns:
- True if empty in lists are supported; false otherwise.
-
supportsExpectedLobUsagePattern
public boolean supportsExpectedLobUsagePattern()Description copied from class:DialectExpected LOB usage pattern is such that I can perform an insert via prepared statement with a parameter binding for a LOB value without crazy casting to JDBC driver implementation-specific classes... Part of the trickiness here is the fact that this is largely driver dependent. For example, Oracle (which is notoriously bad with LOB support in their drivers historically) actually does a pretty good job with LOB support as of the 10.2.x versions of their drivers...- Overrides:
supportsExpectedLobUsagePatternin classDialect- Returns:
- True if normal LOB usage patterns can be used with this driver; false if driver-specific hookiness needs to be applied.
-
supportsLobValueChangePropogation
public boolean supportsLobValueChangePropogation()Description copied from class:DialectDoes the dialect support propagating changes to LOB values back to the database? Talking about mutating the internal value of the locator as opposed to supplying a new locator instance... For BLOBs, the internal value might be changed by:Blob.setBinaryStream(long),Blob.setBytes(long, byte[]),Blob.setBytes(long, byte[], int, int), orBlob.truncate(long). For CLOBs, the internal value might be changed by:Clob.setAsciiStream(long),Clob.setCharacterStream(long),Clob.setString(long, String),Clob.setString(long, String, int, int), orClob.truncate(long). NOTE : I do not know the correct answer currently for databases which (1) are not part of the cruise control process or (2) do notDialect.supportsExpectedLobUsagePattern().- Overrides:
supportsLobValueChangePropogationin classDialect- Returns:
- True if the changes are propagated back to the database; false otherwise.
-
supportsUnboundedLobLocatorMaterialization
public boolean supportsUnboundedLobLocatorMaterialization()Description copied from class:DialectIs it supported to materialize a LOB locator outside the transaction in which it was created? Again, part of the trickiness here is the fact that this is largely driver dependent. NOTE: all database I have tested whichDialect.supportsExpectedLobUsagePattern()also support the ability to materialize a LOB outside the owning transaction...- Overrides:
supportsUnboundedLobLocatorMaterializationin classDialect- Returns:
- True if unbounded materialization is supported; false otherwise.
-
getForUpdateString
Description copied from class:DialectGet the string to append to SELECT statements to acquire locks for this dialect.- Overrides:
getForUpdateStringin classDialect- Returns:
- The appropriate FOR UPDATE clause string.
-
getWriteLockString
Description copied from class:DialectGet the string to append to SELECT statements to acquire WRITE locks for this dialect. Location of the of the returned string is treated the same as getForUpdateString.- Overrides:
getWriteLockStringin classDialect- Parameters:
timeout- in milliseconds, -1 for indefinite wait and 0 for no wait.- Returns:
- The appropriate LOCK clause string.
-
getReadLockString
Description copied from class:DialectGet the string to append to SELECT statements to acquire WRITE locks for this dialect. Location of the of the returned string is treated the same as getForUpdateString.- Overrides:
getReadLockStringin classDialect- Parameters:
timeout- in milliseconds, -1 for indefinite wait and 0 for no wait.- Returns:
- The appropriate LOCK clause string.
-