diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixDialect.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixDialect.java index b3d21c1ca42e..d896e7176cfb 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixDialect.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixDialect.java @@ -466,7 +466,7 @@ protected SqlAstTranslator buildTranslator( @Override public String extractPattern(TemporalUnit unit) { return switch ( unit ) { - case SECOND -> "to_number(to_char(?2,'%S.%F3'))"; + case SECOND -> getVersion().isBefore( 11, 70 ) ? "to_number(to_char(?2,'%S%F3'))" : "to_number(to_char(?2,'%S.%F3'))"; case MINUTE -> "to_number(to_char(?2,'%M'))"; case HOUR -> "to_number(to_char(?2,'%H'))"; case DAY_OF_WEEK -> "(weekday(?2)+1)"; @@ -536,8 +536,8 @@ public String getAddPrimaryKeyConstraintString(String constraintName) { @Override public String getTruncateTableStatement(String tableName) { - return super.getTruncateTableStatement( tableName ) - + " reuse storage keep statistics"; + return super.getTruncateTableStatement( tableName ) + " reuse storage" + + ( getVersion().isSameOrAfter( 12, 10 ) ? " keep statistics" : "" ); } @Override @@ -760,7 +760,7 @@ public boolean isCurrentTimestampSelectStringCallable() { @Override public String getCurrentTimestampSelectString() { - return "select sysdate"; + return "select sysdate" + (getVersion().isBefore( 12, 10 ) ? " from informix.systables where tabid=1" : ""); } @Override @SuppressWarnings("deprecation") @@ -1120,11 +1120,26 @@ public String getDual() { return "(select 0 from systables where tabid=1)"; } + @Override + public String getFromDualForSelectOnly() { + return getVersion().isBefore( 12,10 ) ? " from " + getDual() + " dual" : ""; + } + @Override public boolean supportsCrossJoin() { return false; } + @Override + public boolean supportsIntersect(){ + return getVersion().isSameOrAfter( 12,10 ); + } + + public boolean supportsSubqueryOnMutatingTable() { + //tested on version 11.50, 14.10 + return getVersion().isAfter( 11, 50); + } + @Override public boolean supportsRowValueConstructorSyntax() { return false; @@ -1140,6 +1155,11 @@ public boolean supportsRowValueConstructorSyntaxInInList() { return false; } + @Override + public boolean supportsWithClause() { + return getVersion().isSameOrAfter( 14,10 ); + } + @Override public boolean requiresColumnListInCreateView() { return true; @@ -1156,6 +1176,6 @@ public IdentifierHelper buildIdentifierHelper(IdentifierHelperBuilder builder, @ @Override public DmlTargetColumnQualifierSupport getDmlTargetColumnQualifierSupport() { - return DmlTargetColumnQualifierSupport.TABLE_ALIAS; + return getVersion().isSameOrAfter( 12,10 ) ? DmlTargetColumnQualifierSupport.TABLE_ALIAS : DmlTargetColumnQualifierSupport.NONE; } } diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixSqlAstTranslator.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixSqlAstTranslator.java index 824b4d9ef648..1ae2b05df9f3 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixSqlAstTranslator.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixSqlAstTranslator.java @@ -50,7 +50,8 @@ protected void visitQueryClauses(QuerySpec querySpec) { visitSelectClause( querySpec.getSelectClause() ); visitFromClause( querySpec.getFromClause() ); if ( !hasFrom( querySpec.getFromClause() ) - && hasWhere( querySpec.getWhereClauseRestrictions() ) ) { + && hasWhere( querySpec.getWhereClauseRestrictions() ) + && getDialect().getFromDualForSelectOnly().isBlank() ) { append( " from " ); append( getDual() ); } @@ -321,8 +322,10 @@ public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeti @Override protected void renderDmlTargetTableExpression(NamedTableReference tableReference) { super.renderDmlTargetTableExpression( tableReference ); - if ( getClauseStack().getCurrent() != Clause.INSERT ) { - renderTableReferenceIdentificationVariable( tableReference ); + if (getDialect().getVersion().isSameOrAfter( 12, 10 )) { + if ( getClauseStack().getCurrent() != Clause.INSERT ) { + renderTableReferenceIdentificationVariable( tableReference ); + } } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/filter/DynamicFilterTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/filter/DynamicFilterTest.java index 3ea0c05d223b..a676d561aa9a 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/filter/DynamicFilterTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/filter/DynamicFilterTest.java @@ -683,6 +683,7 @@ public void testFilterApplicationOnHqlQueryWithImplicitSubqueryContainingNamedPa } @Test + @RequiresDialectFeature(DialectChecks.SupportsDmlTargetColumnQualifier.class) public void testFiltersOnSimpleHqlDelete() { Salesperson sp = new Salesperson(); Salesperson sp2 = new Salesperson(); @@ -708,6 +709,7 @@ public void testFiltersOnSimpleHqlDelete() { } @Test + @RequiresDialectFeature(DialectChecks.SupportsDmlTargetColumnQualifier.class) public void testFiltersOnMultiTableHqlDelete() { Salesperson sp = new Salesperson(); Salesperson sp2 = new Salesperson(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/QueryTimeOutTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/QueryTimeOutTest.java index 92d68bcf6a78..910707eb511e 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/QueryTimeOutTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/QueryTimeOutTest.java @@ -11,6 +11,7 @@ import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.AbstractTransactSQLDialect; +import org.hibernate.dialect.DmlTargetColumnQualifierSupport; import org.hibernate.dialect.OracleDialect; import org.hibernate.dialect.SybaseDialect; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; @@ -78,6 +79,9 @@ else if ( DialectContext.getDialect() instanceof SybaseDialect ) { else if ( DialectContext.getDialect() instanceof AbstractTransactSQLDialect ) { baseQuery = "update ae1_0 set name=? from AnEntity ae1_0"; } + else if ( DialectContext.getDialect().getDmlTargetColumnQualifierSupport() == DmlTargetColumnQualifierSupport.NONE ) { + baseQuery = "update AnEntity set name=?"; + } else { baseQuery = "update AnEntity ae1_0 set name=?"; } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/mutationquery/MutationQueriesFilterTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/mutationquery/MutationQueriesFilterTest.java index c20f57a9767e..7a6bdc58ab9c 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/mutationquery/MutationQueriesFilterTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/mutationquery/MutationQueriesFilterTest.java @@ -11,8 +11,10 @@ import org.hibernate.query.MutationQuery; import org.hibernate.testing.jdbc.SQLStatementInspector; +import org.hibernate.testing.orm.junit.DialectFeatureChecks; import org.hibernate.testing.orm.junit.DomainModel; import org.hibernate.testing.orm.junit.Jira; +import org.hibernate.testing.orm.junit.RequiresDialectFeature; import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.junit.jupiter.api.Test; @@ -47,6 +49,7 @@ MutationQueriesFilterTest.RoleEntity.class } ) @Jira( "https://hibernate.atlassian.net/browse/HHH-16392" ) +@RequiresDialectFeature( feature = DialectFeatureChecks.SupportsDmlTargetColumnQualifier.class ) public class MutationQueriesFilterTest { @Test public void testDelete(SessionFactoryScope scope) { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/mutationquery/MutationQueriesWhereAndFilterTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/mutationquery/MutationQueriesWhereAndFilterTest.java index 75131e4c97fd..412907e672a1 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/mutationquery/MutationQueriesWhereAndFilterTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/mutationquery/MutationQueriesWhereAndFilterTest.java @@ -12,8 +12,10 @@ import org.hibernate.query.MutationQuery; import org.hibernate.testing.jdbc.SQLStatementInspector; +import org.hibernate.testing.orm.junit.DialectFeatureChecks; import org.hibernate.testing.orm.junit.DomainModel; import org.hibernate.testing.orm.junit.Jira; +import org.hibernate.testing.orm.junit.RequiresDialectFeature; import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.junit.jupiter.api.Test; @@ -48,6 +50,7 @@ MutationQueriesWhereAndFilterTest.RoleEntity.class } ) @Jira( "https://hibernate.atlassian.net/browse/HHH-16392" ) +@RequiresDialectFeature( feature = DialectFeatureChecks.SupportsDmlTargetColumnQualifier.class ) public class MutationQueriesWhereAndFilterTest { @Test public void testDelete(SessionFactoryScope scope) { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/mutationquery/MutationQueriesWhereTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/mutationquery/MutationQueriesWhereTest.java index e630a921987b..638755078480 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/mutationquery/MutationQueriesWhereTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/mutationquery/MutationQueriesWhereTest.java @@ -10,8 +10,10 @@ import org.hibernate.query.MutationQuery; import org.hibernate.testing.jdbc.SQLStatementInspector; +import org.hibernate.testing.orm.junit.DialectFeatureChecks; import org.hibernate.testing.orm.junit.DomainModel; import org.hibernate.testing.orm.junit.Jira; +import org.hibernate.testing.orm.junit.RequiresDialectFeature; import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.junit.jupiter.api.Test; @@ -46,6 +48,7 @@ MutationQueriesWhereTest.RoleEntity.class } ) @Jira( "https://hibernate.atlassian.net/browse/HHH-16392" ) +@RequiresDialectFeature( feature = DialectFeatureChecks.SupportsDmlTargetColumnQualifier.class ) public class MutationQueriesWhereTest { @Test public void testDelete(SessionFactoryScope scope) { diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/DialectChecks.java b/hibernate-testing/src/main/java/org/hibernate/testing/DialectChecks.java index 140161e73ddf..26f4499a88f3 100644 --- a/hibernate-testing/src/main/java/org/hibernate/testing/DialectChecks.java +++ b/hibernate-testing/src/main/java/org/hibernate/testing/DialectChecks.java @@ -9,6 +9,7 @@ import org.hibernate.dialect.DB2Dialect; import org.hibernate.community.dialect.DerbyDialect; import org.hibernate.dialect.Dialect; +import org.hibernate.dialect.DmlTargetColumnQualifierSupport; import org.hibernate.dialect.HANADialect; import org.hibernate.dialect.MySQLDialect; import org.hibernate.dialect.NationalizationSupport; @@ -309,4 +310,11 @@ public boolean isMatch(Dialect dialect) { return dialect.rowId("") != null; } } + + public static class SupportsDmlTargetColumnQualifier implements DialectCheck { + @Override + public boolean isMatch(Dialect dialect) { + return dialect.getDmlTargetColumnQualifierSupport() != DmlTargetColumnQualifierSupport.NONE; + } + } } diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/DialectFeatureChecks.java b/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/DialectFeatureChecks.java index 7bb583f3801f..f79cae673394 100644 --- a/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/DialectFeatureChecks.java +++ b/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/DialectFeatureChecks.java @@ -49,6 +49,7 @@ import org.hibernate.dialect.CockroachDialect; import org.hibernate.dialect.DB2Dialect; import org.hibernate.dialect.Dialect; +import org.hibernate.dialect.DmlTargetColumnQualifierSupport; import org.hibernate.dialect.H2Dialect; import org.hibernate.dialect.HANADialect; import org.hibernate.dialect.HSQLDialect; @@ -1172,6 +1173,12 @@ public boolean apply(Dialect dialect) { } } + public static class SupportsDmlTargetColumnQualifier implements DialectFeatureCheck { + @Override + public boolean apply(Dialect dialect) { + return dialect.getDmlTargetColumnQualifierSupport() != DmlTargetColumnQualifierSupport.NONE; + } + } private static SqmFunctionRegistry getSqmFunctionRegistry(Dialect dialect) { SqmFunctionRegistry sqmFunctionRegistry = FUNCTION_REGISTRIES.get( dialect );