Skip to content

Commit 4f867b3

Browse files
committed
HHH-19694 Enhanced support for older Informix
1 parent 7d4af9b commit 4f867b3

File tree

11 files changed

+74
-8
lines changed

11 files changed

+74
-8
lines changed

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixDialect.java

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,7 @@ protected <T extends JdbcOperation> SqlAstTranslator<T> buildTranslator(
466466
@Override
467467
public String extractPattern(TemporalUnit unit) {
468468
return switch ( unit ) {
469-
case SECOND -> "to_number(to_char(?2,'%S.%F3'))";
469+
case SECOND -> getVersion().isBefore( 11, 70 ) ? "to_number(to_char(?2,'%S%F3'))" : "to_number(to_char(?2,'%S.%F3'))";
470470
case MINUTE -> "to_number(to_char(?2,'%M'))";
471471
case HOUR -> "to_number(to_char(?2,'%H'))";
472472
case DAY_OF_WEEK -> "(weekday(?2)+1)";
@@ -536,8 +536,8 @@ public String getAddPrimaryKeyConstraintString(String constraintName) {
536536

537537
@Override
538538
public String getTruncateTableStatement(String tableName) {
539-
return super.getTruncateTableStatement( tableName )
540-
+ " reuse storage keep statistics";
539+
return super.getTruncateTableStatement( tableName ) + " reuse storage"
540+
+ ( getVersion().isSameOrAfter( 12, 10 ) ? " keep statistics" : "" );
541541
}
542542

543543
@Override
@@ -760,7 +760,7 @@ public boolean isCurrentTimestampSelectStringCallable() {
760760

761761
@Override
762762
public String getCurrentTimestampSelectString() {
763-
return "select sysdate";
763+
return "select sysdate" + (getVersion().isBefore( 12, 10 ) ? " from informix.systables where tabid=1" : "");
764764
}
765765

766766
@Override @SuppressWarnings("deprecation")
@@ -1120,11 +1120,26 @@ public String getDual() {
11201120
return "(select 0 from systables where tabid=1)";
11211121
}
11221122

1123+
@Override
1124+
public String getFromDualForSelectOnly() {
1125+
return getVersion().isBefore( 12,10 ) ? " from " + getDual() + " dual" : "";
1126+
}
1127+
11231128
@Override
11241129
public boolean supportsCrossJoin() {
11251130
return false;
11261131
}
11271132

1133+
@Override
1134+
public boolean supportsIntersect(){
1135+
return getVersion().isSameOrAfter( 12,10 );
1136+
}
1137+
1138+
public boolean supportsSubqueryOnMutatingTable() {
1139+
//tested on version 11.50, 14.10
1140+
return getVersion().isAfter( 11, 50);
1141+
}
1142+
11281143
@Override
11291144
public boolean supportsRowValueConstructorSyntax() {
11301145
return false;
@@ -1140,6 +1155,11 @@ public boolean supportsRowValueConstructorSyntaxInInList() {
11401155
return false;
11411156
}
11421157

1158+
@Override
1159+
public boolean supportsWithClause() {
1160+
return getVersion().isSameOrAfter( 14,10 );
1161+
}
1162+
11431163
@Override
11441164
public boolean requiresColumnListInCreateView() {
11451165
return true;
@@ -1156,6 +1176,6 @@ public IdentifierHelper buildIdentifierHelper(IdentifierHelperBuilder builder, @
11561176

11571177
@Override
11581178
public DmlTargetColumnQualifierSupport getDmlTargetColumnQualifierSupport() {
1159-
return DmlTargetColumnQualifierSupport.TABLE_ALIAS;
1179+
return getVersion().isSameOrAfter( 12,10 ) ? DmlTargetColumnQualifierSupport.TABLE_ALIAS : DmlTargetColumnQualifierSupport.NONE;
11601180
}
11611181
}

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixSqlAstTranslator.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ protected void visitQueryClauses(QuerySpec querySpec) {
5050
visitSelectClause( querySpec.getSelectClause() );
5151
visitFromClause( querySpec.getFromClause() );
5252
if ( !hasFrom( querySpec.getFromClause() )
53-
&& hasWhere( querySpec.getWhereClauseRestrictions() ) ) {
53+
&& hasWhere( querySpec.getWhereClauseRestrictions() )
54+
&& getDialect().getFromDualForSelectOnly().isBlank() ) {
5455
append( " from " );
5556
append( getDual() );
5657
}
@@ -321,8 +322,10 @@ public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeti
321322
@Override
322323
protected void renderDmlTargetTableExpression(NamedTableReference tableReference) {
323324
super.renderDmlTargetTableExpression( tableReference );
324-
if ( getClauseStack().getCurrent() != Clause.INSERT ) {
325-
renderTableReferenceIdentificationVariable( tableReference );
325+
if (getDialect().getVersion().isSameOrAfter( 12, 10 )) {
326+
if ( getClauseStack().getCurrent() != Clause.INSERT ) {
327+
renderTableReferenceIdentificationVariable( tableReference );
328+
}
326329
}
327330
}
328331

hibernate-core/src/test/java/org/hibernate/orm/test/filter/DynamicFilterTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,7 @@ public void testFilterApplicationOnHqlQueryWithImplicitSubqueryContainingNamedPa
683683
}
684684

685685
@Test
686+
@RequiresDialectFeature(DialectChecks.SupportsDmlTargetColumnQualifier.class)
686687
public void testFiltersOnSimpleHqlDelete() {
687688
Salesperson sp = new Salesperson();
688689
Salesperson sp2 = new Salesperson();
@@ -708,6 +709,7 @@ public void testFiltersOnSimpleHqlDelete() {
708709
}
709710

710711
@Test
712+
@RequiresDialectFeature(DialectChecks.SupportsDmlTargetColumnQualifier.class)
711713
public void testFiltersOnMultiTableHqlDelete() {
712714
Salesperson sp = new Salesperson();
713715
Salesperson sp2 = new Salesperson();

hibernate-core/src/test/java/org/hibernate/orm/test/hql/HQLTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1487,6 +1487,7 @@ public void test_hql_aggregate_functions_example_3() {
14871487
}
14881488

14891489
@Test
1490+
@SkipForDialect( dialectClass = InformixDialect.class, majorVersion = 11, minorVersion = 50, reason = "Informix does not support case expressions within count function")
14901491
public void test_hql_aggregate_functions_simple_filter_example() {
14911492
doInJPA(this::entityManagerFactory, entityManager -> {
14921493
//tag::hql-aggregate-functions-simple-filter-example[]
@@ -1502,6 +1503,7 @@ public void test_hql_aggregate_functions_simple_filter_example() {
15021503
}
15031504

15041505
@Test
1506+
@SkipForDialect( dialectClass = InformixDialect.class, majorVersion = 11, minorVersion = 50, reason = "Informix does not support case expressions within count function")
15051507
public void test_hql_aggregate_functions_filter_example() {
15061508
doInJPA(this::entityManagerFactory, entityManager -> {
15071509
//tag::hql-aggregate-functions-filter-example[]
@@ -1647,6 +1649,7 @@ public void test_hql_length_function_example() {
16471649
}
16481650

16491651
@Test
1652+
@SkipForDialect( dialectClass = InformixDialect.class, majorVersion = 11, minorVersion = 70, reason = "Informix does not support locate function")
16501653
public void test_hql_locate_function_example() {
16511654
doInJPA(this::entityManagerFactory, entityManager -> {
16521655
//tag::hql-locate-function-example[]
@@ -1661,6 +1664,7 @@ public void test_hql_locate_function_example() {
16611664
}
16621665

16631666
@Test
1667+
@SkipForDialect( dialectClass = InformixDialect.class, majorVersion = 11, minorVersion = 70, reason = "Informix does not support position function")
16641668
public void test_hql_position_function_example() {
16651669
doInJPA(this::entityManagerFactory, entityManager -> {
16661670
//tag::hql-position-function-example[]

hibernate-core/src/test/java/org/hibernate/orm/test/query/QueryTimeOutTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import org.hibernate.cfg.AvailableSettings;
1313
import org.hibernate.dialect.AbstractTransactSQLDialect;
14+
import org.hibernate.dialect.DmlTargetColumnQualifierSupport;
1415
import org.hibernate.dialect.OracleDialect;
1516
import org.hibernate.dialect.SybaseDialect;
1617
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
@@ -78,6 +79,9 @@ else if ( DialectContext.getDialect() instanceof SybaseDialect ) {
7879
else if ( DialectContext.getDialect() instanceof AbstractTransactSQLDialect ) {
7980
baseQuery = "update ae1_0 set name=? from AnEntity ae1_0";
8081
}
82+
else if ( DialectContext.getDialect().getDmlTargetColumnQualifierSupport() == DmlTargetColumnQualifierSupport.NONE ) {
83+
baseQuery = "update AnEntity set name=?";
84+
}
8185
else {
8286
baseQuery = "update AnEntity ae1_0 set name=?";
8387
}

hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/StandardFunctionTests.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -893,6 +893,15 @@ public void testSimpleCountFunctions(SessionFactoryScope scope) {
893893
session -> {
894894
session.createQuery("select count(*) from EntityOfBasics e")
895895
.list();
896+
}
897+
);
898+
}
899+
900+
@Test
901+
@SkipForDialect( dialectClass = InformixDialect.class, majorVersion = 11, minorVersion = 50, reason = "Informix does not support count(1) function")
902+
public void testSimpleCount1Functions(SessionFactoryScope scope) {
903+
scope.inTransaction(
904+
session -> {
896905
session.createQuery("select count(1) from EntityOfBasics e")
897906
.list();
898907
}

hibernate-core/src/test/java/org/hibernate/orm/test/query/mutationquery/MutationQueriesFilterTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111
import org.hibernate.query.MutationQuery;
1212

1313
import org.hibernate.testing.jdbc.SQLStatementInspector;
14+
import org.hibernate.testing.orm.junit.DialectFeatureChecks;
1415
import org.hibernate.testing.orm.junit.DomainModel;
1516
import org.hibernate.testing.orm.junit.Jira;
17+
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
1618
import org.hibernate.testing.orm.junit.SessionFactory;
1719
import org.hibernate.testing.orm.junit.SessionFactoryScope;
1820
import org.junit.jupiter.api.Test;
@@ -47,6 +49,7 @@
4749
MutationQueriesFilterTest.RoleEntity.class
4850
} )
4951
@Jira( "https://hibernate.atlassian.net/browse/HHH-16392" )
52+
@RequiresDialectFeature( feature = DialectFeatureChecks.SupportsDmlTargetColumnQualifier.class )
5053
public class MutationQueriesFilterTest {
5154
@Test
5255
public void testDelete(SessionFactoryScope scope) {

hibernate-core/src/test/java/org/hibernate/orm/test/query/mutationquery/MutationQueriesWhereAndFilterTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@
1212
import org.hibernate.query.MutationQuery;
1313

1414
import org.hibernate.testing.jdbc.SQLStatementInspector;
15+
import org.hibernate.testing.orm.junit.DialectFeatureChecks;
1516
import org.hibernate.testing.orm.junit.DomainModel;
1617
import org.hibernate.testing.orm.junit.Jira;
18+
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
1719
import org.hibernate.testing.orm.junit.SessionFactory;
1820
import org.hibernate.testing.orm.junit.SessionFactoryScope;
1921
import org.junit.jupiter.api.Test;
@@ -48,6 +50,7 @@
4850
MutationQueriesWhereAndFilterTest.RoleEntity.class
4951
} )
5052
@Jira( "https://hibernate.atlassian.net/browse/HHH-16392" )
53+
@RequiresDialectFeature( feature = DialectFeatureChecks.SupportsDmlTargetColumnQualifier.class )
5154
public class MutationQueriesWhereAndFilterTest {
5255
@Test
5356
public void testDelete(SessionFactoryScope scope) {

hibernate-core/src/test/java/org/hibernate/orm/test/query/mutationquery/MutationQueriesWhereTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
import org.hibernate.query.MutationQuery;
1111

1212
import org.hibernate.testing.jdbc.SQLStatementInspector;
13+
import org.hibernate.testing.orm.junit.DialectFeatureChecks;
1314
import org.hibernate.testing.orm.junit.DomainModel;
1415
import org.hibernate.testing.orm.junit.Jira;
16+
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
1517
import org.hibernate.testing.orm.junit.SessionFactory;
1618
import org.hibernate.testing.orm.junit.SessionFactoryScope;
1719
import org.junit.jupiter.api.Test;
@@ -46,6 +48,7 @@
4648
MutationQueriesWhereTest.RoleEntity.class
4749
} )
4850
@Jira( "https://hibernate.atlassian.net/browse/HHH-16392" )
51+
@RequiresDialectFeature( feature = DialectFeatureChecks.SupportsDmlTargetColumnQualifier.class )
4952
public class MutationQueriesWhereTest {
5053
@Test
5154
public void testDelete(SessionFactoryScope scope) {

hibernate-testing/src/main/java/org/hibernate/testing/DialectChecks.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.hibernate.dialect.DB2Dialect;
1010
import org.hibernate.community.dialect.DerbyDialect;
1111
import org.hibernate.dialect.Dialect;
12+
import org.hibernate.dialect.DmlTargetColumnQualifierSupport;
1213
import org.hibernate.dialect.HANADialect;
1314
import org.hibernate.dialect.MySQLDialect;
1415
import org.hibernate.dialect.NationalizationSupport;
@@ -309,4 +310,11 @@ public boolean isMatch(Dialect dialect) {
309310
return dialect.rowId("") != null;
310311
}
311312
}
313+
314+
public static class SupportsDmlTargetColumnQualifier implements DialectCheck {
315+
@Override
316+
public boolean isMatch(Dialect dialect) {
317+
return dialect.getDmlTargetColumnQualifierSupport() != DmlTargetColumnQualifierSupport.NONE;
318+
}
319+
}
312320
}

0 commit comments

Comments
 (0)