Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -146,14 +146,14 @@ public String[] getSqlCreateStrings(
ForeignKey foreignKey,
Metadata metadata,
SqlStringGenerationContext context) {
String[] results = super.getSqlCreateStrings( foreignKey, metadata, context );
final String[] results = super.getSqlCreateStrings( foreignKey, metadata, context );
for ( int i = 0; i < results.length; i++ ) {
String result = results[i];
final String result = results[i];
if ( result.contains( " on delete " ) ) {
String constraintName = "constraint " + foreignKey.getName();
result = result.replace( constraintName + " ", "" );
result = result + " " + constraintName;
results[i] = result;
final String constraintName = "constraint " + foreignKey.getName();
results[i] =
result.replace( constraintName + " ", "" )
+ " " + constraintName;
}
}
return results;
Expand All @@ -174,11 +174,12 @@ protected String primaryKeyString(PrimaryKey key) {
}
constraint.append( column.getQuotedName( dialect ) );
}
constraint.append(')');
constraint.append( ')' );
final UniqueKey orderingUniqueKey = key.getOrderingUniqueKey();
if ( orderingUniqueKey != null && orderingUniqueKey.isNameExplicit() ) {
constraint.append( " constraint " )
.append( orderingUniqueKey.getName() ).append( ' ' );
.append( orderingUniqueKey.getName() )
.append( ' ' );
}
return constraint.toString();
}
Expand Down Expand Up @@ -313,6 +314,11 @@ public int getDoublePrecision() {
return 16;
}

@Override
public boolean doesReadCommittedCauseWritersToBlockReaders() {
return true;
}

@Override
public SelectItemReferenceStrategy getGroupBySelectItemReferenceStrategy() {
return SelectItemReferenceStrategy.POSITION;
Expand Down Expand Up @@ -351,11 +357,11 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
functionFactory.variance();
functionFactory.bitLength_pattern( "length(?1)*8" );
functionFactory.varPop_sumCount();
functionFactory.hypotheticalOrderedSetAggregates();

final SqmFunctionRegistry functionRegistry = functionContributions.getFunctionRegistry();
final TypeConfiguration typeConfiguration = functionContributions.getTypeConfiguration();
final BasicType<String> stringBasicType = typeConfiguration.getBasicTypeRegistry().resolve( StandardBasicTypes.STRING );
final BasicType<String> stringBasicType =
typeConfiguration.getBasicTypeRegistry().resolve( StandardBasicTypes.STRING );

functionRegistry.registerAlternateKey( "var_samp", "variance" );

Expand All @@ -365,16 +371,22 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio

//coalesce() and nullif() both supported since Informix 12

functionRegistry.register( "least", new CaseLeastGreatestEmulation( true ) );
functionRegistry.register( "greatest", new CaseLeastGreatestEmulation( false ) );
// least() and greatest() supported since 12.10
if ( getVersion().isBefore( 12, 10 ) ) {
functionRegistry.register( "least", new CaseLeastGreatestEmulation( true ) );
functionRegistry.register( "greatest", new CaseLeastGreatestEmulation( false ) );
}

functionRegistry.namedDescriptorBuilder( "matches" )
.setInvariantType( stringBasicType )
.setExactArgumentCount( 2 )
.setArgumentTypeResolver( impliedOrInvariant( typeConfiguration, STRING ) )
.setArgumentListSignature( "(STRING string, STRING pattern)" )
.register();

if ( supportsWindowFunctions() ) {
functionFactory.windowFunctions();
functionFactory.hypotheticalOrderedSetAggregates();
}

functionRegistry.register( "overlay",
Expand Down Expand Up @@ -505,6 +517,12 @@ public String getAddPrimaryKeyConstraintString(String constraintName) {
return " add constraint primary key constraint " + constraintName + " ";
}

@Override
public String getTruncateTableStatement(String tableName) {
return super.getTruncateTableStatement( tableName )
+ " reuse storage keep statistics";
}

@Override
public SequenceSupport getSequenceSupport() {
return sequenceSupport;
Expand Down Expand Up @@ -568,6 +586,21 @@ public boolean dropConstraints() {
return !getVersion().isSameOrAfter( 12, 10 );
}

@Override
public boolean canDisableConstraints() {
return true;
}

@Override
public String getDisableConstraintStatement(String tableName, String name) {
return "set constraints " + name + " disabled";
}

@Override
public String getEnableConstraintStatement(String tableName, String name) {
return "set constraints " + name + " enabled";
}

@Override
public boolean supportsOrderByInSubquery() {
// This is just a guess
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,10 @@
import org.hibernate.Session;
import org.hibernate.annotations.FetchProfile;
import org.hibernate.annotations.FetchProfileOverride;
import org.hibernate.community.dialect.InformixDialect;
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
import org.hibernate.testing.orm.junit.Jpa;
import org.hibernate.testing.orm.junit.SkipForDialect;
import org.junit.jupiter.api.Test;

import java.util.List;
Expand All @@ -35,6 +37,8 @@
@Jpa(annotatedClasses = FindOptionsTest.MyEntity.class)
public class FindOptionsTest {
@Test
@SkipForDialect(dialectClass = InformixDialect.class,
reason = "Informix disallows FOR UPDATE with multi-table queries")
void test(EntityManagerFactoryScope scope) {
MyEntity hello = new MyEntity("Hello");
scope.getEntityManagerFactory()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
*/
package org.hibernate.orm.test.jpa.lock;

import java.sql.Connection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand All @@ -21,6 +22,7 @@
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.community.dialect.AltibaseDialect;
import org.hibernate.community.dialect.FirebirdDialect;
import org.hibernate.community.dialect.InformixDialect;
import org.hibernate.dialect.HANADialect;
import org.hibernate.dialect.CockroachDialect;
import org.hibernate.community.dialect.DerbyDialect;
Expand Down Expand Up @@ -68,6 +70,10 @@ public class LockTest extends BaseEntityManagerFunctionalTestCase {
@Override
protected void addConfigOptions(Map options) {
super.addConfigOptions( options );
if ( getDialect() instanceof InformixDialect ) {
options.put( AvailableSettings.ISOLATION,
Connection.TRANSACTION_REPEATABLE_READ );
}
// We can't use a shared connection provider if we use TransactionUtil.setJdbcTimeout because that is set on the connection level
// options.remove( AvailableSettings.CONNECTION_PROVIDER );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@
*/
package org.hibernate.orm.test.jpa.lock;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import jakarta.persistence.LockModeType;
import org.hibernate.Session;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.community.dialect.AltibaseDialect;
import org.hibernate.community.dialect.InformixDialect;
import org.hibernate.dialect.CockroachDialect;
import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase;
import org.hibernate.testing.orm.jdbc.PreparedStatementSpyConnectionProvider;
Expand Down Expand Up @@ -48,6 +51,10 @@ protected Map getConfig() {
org.hibernate.cfg.AvailableSettings.CONNECTION_PROVIDER,
CONNECTION_PROVIDER
);
if ( getDialect() instanceof InformixDialect ) {
config.put( AvailableSettings.ISOLATION,
Connection.TRANSACTION_REPEATABLE_READ );
}
return config;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@
import jakarta.persistence.InheritanceType;
import jakarta.persistence.LockModeType;
import jakarta.persistence.Version;
import org.hibernate.community.dialect.InformixDialect;
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
import org.hibernate.testing.orm.junit.Jira;
import org.hibernate.testing.orm.junit.Jpa;
import org.hibernate.testing.orm.junit.SkipForDialect;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -55,6 +57,8 @@ public void tearDown(EntityManagerFactoryScope scope) {
}

@Test
@SkipForDialect(dialectClass = InformixDialect.class,
reason = "Informix disallows FOR UPDATE with multi-table queries")
public void findWithLock(EntityManagerFactoryScope scope) {
scope.inTransaction(entityManager -> {
BaseThing t = entityManager.find( BaseThing.class, 1L, LockModeType.PESSIMISTIC_WRITE );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
*/
package org.hibernate.orm.test.locking;

import java.sql.Connection;
import java.util.Collections;

import jakarta.persistence.LockModeType;
Expand All @@ -14,7 +15,9 @@
import org.hibernate.LockMode;
import org.hibernate.Session;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.community.dialect.AltibaseDialect;
import org.hibernate.community.dialect.InformixDialect;
import org.hibernate.dialect.CockroachDialect;
import org.hibernate.dialect.SQLServerDialect;
import org.hibernate.dialect.SybaseASEDialect;
Expand Down Expand Up @@ -62,6 +65,10 @@ protected void applySettings(StandardServiceRegistryBuilder ssrBuilder) {
super.applySettings( ssrBuilder );
// We can't use a shared connection provider if we use TransactionUtil.setJdbcTimeout because that is set on the connection level
// ssrBuilder.getSettings().remove( AvailableSettings.CONNECTION_PROVIDER );
if ( getDialect() instanceof InformixDialect ) {
ssrBuilder.applySetting( AvailableSettings.ISOLATION,
Connection.TRANSACTION_REPEATABLE_READ );
}
}

@BeforeEach
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,12 @@

import org.hibernate.Hibernate;

import org.hibernate.community.dialect.InformixDialect;
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
import org.hibernate.testing.orm.junit.Jpa;
import org.junit.jupiter.api.BeforeAll;
import org.hibernate.testing.orm.junit.SkipForDialect;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import jakarta.persistence.CascadeType;
Expand All @@ -34,7 +37,7 @@
)
public class LockRefreshReferencedAndCascadingTest {

@BeforeAll
@BeforeEach
public void setUp(EntityManagerFactoryScope scope) {
scope.inTransaction(
entityManager -> {
Expand All @@ -52,7 +55,14 @@ public void setUp(EntityManagerFactoryScope scope) {
);
}

@AfterEach
public void tearDown(EntityManagerFactoryScope scope) {
scope.getEntityManagerFactory().getSchemaManager().truncate();
}

@Test
@SkipForDialect(dialectClass = InformixDialect.class,
reason = "Informix disallows FOR UPDATE with multi-table queries")
public void testRefreshBeforeRead(EntityManagerFactoryScope scope) {
scope.inTransaction(
entityManager -> {
Expand Down Expand Up @@ -100,6 +110,8 @@ public void testRefresh(EntityManagerFactoryScope scope) {
}

@Test
@SkipForDialect(dialectClass = InformixDialect.class,
reason = "Informix disallows FOR UPDATE with multi-table queries")
public void testRefreshAfterRead(EntityManagerFactoryScope scope) {
scope.inTransaction(
entityManager -> {
Expand All @@ -124,6 +136,8 @@ public void testRefreshAfterRead(EntityManagerFactoryScope scope) {
}

@Test
@SkipForDialect(dialectClass = InformixDialect.class,
reason = "Informix disallows FOR UPDATE with multi-table queries")
public void testRefreshLockMode(EntityManagerFactoryScope scope) {
scope.inTransaction(
entityManager -> {
Expand All @@ -150,6 +164,8 @@ public void testRefreshLockMode(EntityManagerFactoryScope scope) {
}

@Test
@SkipForDialect(dialectClass = InformixDialect.class,
reason = "Informix disallows FOR UPDATE with multi-table queries")
public void testFindWithLockMode(EntityManagerFactoryScope scope) {
scope.inTransaction(
session -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@

import org.hibernate.Hibernate;

import org.hibernate.community.dialect.InformixDialect;
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
import org.hibernate.testing.orm.junit.JiraKey;
import org.hibernate.testing.orm.junit.Jpa;
import org.hibernate.testing.orm.junit.SkipForDialect;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

Expand Down Expand Up @@ -117,6 +119,8 @@ public void testRefreshAfterRead(EntityManagerFactoryScope scope) {


@Test
@SkipForDialect(dialectClass = InformixDialect.class,
reason = "Informix disallows FOR UPDATE with multi-table queries")
public void testFindWithLockMode(EntityManagerFactoryScope scope) {
scope.inTransaction(
session -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.util.concurrent.TimeUnit;

import org.hibernate.community.dialect.AltibaseDialect;
import org.hibernate.community.dialect.InformixDialect;
import org.hibernate.dialect.CockroachDialect;
import org.hibernate.dialect.HSQLDialect;
import org.hibernate.dialect.OracleDialect;
Expand Down Expand Up @@ -39,6 +40,8 @@
@SkipForDialect(dialectClass = CockroachDialect.class, reason = "Cockroach allows the concurrent access but cancels one or both transactions at the end")
@SkipForDialect(dialectClass = OracleDialect.class, majorVersion = 11, reason = "Timeouts don't work on Oracle 11 when using a driver other than ojdbc6, but we can't test with that driver")
@SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase does not support timeout in statement level")
@SkipForDialect(dialectClass = InformixDialect.class, reason = "Test requires REPEATABLE_READ (and then it passes)")
//@ServiceRegistry(settings = @Setting(name = AvailableSettings.ISOLATION, value = "REPEATABLE_READ"))
public class FollowOnLockingTest {

@Test
Expand Down
Loading