Skip to content

Commit fe2be00

Browse files
committed
HHH-19694 Enhanced support for older Informix
1 parent 513bbb7 commit fe2be00

24 files changed

+95
-29
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
@@ -751,7 +751,7 @@ public boolean isCurrentTimestampSelectStringCallable() {
751751

752752
@Override
753753
public String getCurrentTimestampSelectString() {
754-
return "select sysdate";
754+
return "select sysdate" + (getVersion().isBefore( 12, 10 ) ? " from informix.systables where tabid=1" : "");
755755
}
756756

757757
@Override @SuppressWarnings("deprecation")
@@ -1111,11 +1111,26 @@ public String getDual() {
11111111
return "(select 0 from systables where tabid=1)";
11121112
}
11131113

1114+
@Override
1115+
public String getFromDualForSelectOnly() {
1116+
return getVersion().isBefore( 12,10 ) ? " from " + getDual() + " dual" : "";
1117+
}
1118+
11141119
@Override
11151120
public boolean supportsCrossJoin() {
11161121
return false;
11171122
}
11181123

1124+
@Override
1125+
public boolean supportsIntersect(){
1126+
return getVersion().isSameOrAfter( 12,10 );
1127+
}
1128+
1129+
public boolean supportsSubqueryOnMutatingTable() {
1130+
//tested on version 11.50, 14.10
1131+
return getVersion().isAfter( 11, 50);
1132+
}
1133+
11191134
@Override
11201135
public boolean supportsRowValueConstructorSyntax() {
11211136
return false;
@@ -1131,6 +1146,11 @@ public boolean supportsRowValueConstructorSyntaxInInList() {
11311146
return false;
11321147
}
11331148

1149+
@Override
1150+
public boolean supportsWithClause() {
1151+
return getVersion().isSameOrAfter( 14,10 );
1152+
}
1153+
11341154
@Override
11351155
public boolean requiresColumnListInCreateView() {
11361156
return true;
@@ -1147,6 +1167,6 @@ public IdentifierHelper buildIdentifierHelper(IdentifierHelperBuilder builder, @
11471167

11481168
@Override
11491169
public DmlTargetColumnQualifierSupport getDmlTargetColumnQualifierSupport() {
1150-
return DmlTargetColumnQualifierSupport.TABLE_ALIAS;
1170+
return getVersion().isSameOrAfter( 12,10 ) ? DmlTargetColumnQualifierSupport.TABLE_ALIAS : DmlTargetColumnQualifierSupport.NONE;
11511171
}
11521172
}

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/BulkManipulationTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,10 @@ public void testUpdateWithSubquery() {
8989
s.beginTransaction();
9090

9191
// just checking parsing and syntax...
92-
s.createQuery( "update Human h set h.bodyWeight = h.bodyWeight + (select count(1) from IntegerVersioned)" )
92+
s.createQuery( "update Human h set h.bodyWeight = h.bodyWeight + (select count(*) from IntegerVersioned)" )
9393
.executeUpdate();
9494
s.createQuery(
95-
"update Human h set h.bodyWeight = h.bodyWeight + (select count(1) from IntegerVersioned) where h.description = 'abc'" )
95+
"update Human h set h.bodyWeight = h.bodyWeight + (select count(*) from IntegerVersioned) where h.description = 'abc'" )
9696
.executeUpdate();
9797

9898
s.getTransaction().commit();

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/insertordering/InsertOrderingWithJoinedTableInheritance.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,12 @@ public void testBatchingAmongstSubClasses() {
8787

8888
sessionFactoryScope().inTransaction( (session) -> {
8989
final Long specialPersonCount = session
90-
.createSelectionQuery( "select count(1) from SpecialPerson", Long.class )
90+
.createSelectionQuery( "select count(*) from SpecialPerson", Long.class )
9191
.getSingleResult();
9292
assertThat( specialPersonCount ).isEqualTo( 12L );
9393

9494
final Long addressCount = session
95-
.createSelectionQuery( "select count(1) from Address", Long.class )
95+
.createSelectionQuery( "select count(*) from Address", Long.class )
9696
.getSingleResult();
9797
assertThat( addressCount ).isEqualTo( 24L );
9898
} );

hibernate-core/src/test/java/org/hibernate/orm/test/insertordering/InsertOrderingWithJoinedTableMultiLevelInheritance.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,22 +91,22 @@ public void testBatchingAmongstSubClasses() {
9191
// 1 AnotherPerson per loop (2)
9292
// 1 President per loop (2)
9393
final Long addressCount = session
94-
.createSelectionQuery( "select count(1) from Address", Long.class )
94+
.createSelectionQuery( "select count(*) from Address", Long.class )
9595
.getSingleResult();
9696
assertThat( addressCount ).isEqualTo( 4L );
9797

9898
final Long officeCount = session
99-
.createSelectionQuery( "select count(1) from Office", Long.class )
99+
.createSelectionQuery( "select count(*) from Office", Long.class )
100100
.getSingleResult();
101101
assertThat( officeCount ).isEqualTo( 2L );
102102

103103
final Long presidentCount = session
104-
.createSelectionQuery( "select count(1) from President", Long.class )
104+
.createSelectionQuery( "select count(*) from President", Long.class )
105105
.getSingleResult();
106106
assertThat( presidentCount ).isEqualTo( 2L );
107107

108108
final Long anotherPersonCount = session
109-
.createSelectionQuery( "select count(1) from AnotherPerson", Long.class )
109+
.createSelectionQuery( "select count(*) from AnotherPerson", Long.class )
110110
.getSingleResult();
111111
assertThat( presidentCount ).isEqualTo( 2L );
112112

hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/BooleanMappingTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ public void testNegatedCriteriaUsage(SessionFactoryScope scope) {
315315
private int countByCriteria(String attributeName, boolean matchValue, SessionImplementor session) {
316316
final HibernateCriteriaBuilder builder = session.getCriteriaBuilder();
317317
final JpaCriteriaQuery<Long> criteria = builder.createQuery( Long.class );
318-
criteria.select( builder.count( builder.literal( 1 ) ) );
318+
criteria.select( builder.count() );
319319
final JpaRoot<EntityOfBooleans> root = criteria.from( EntityOfBooleans.class );
320320
final JpaPath<Boolean> convertedYesNo = root.get( attributeName );
321321
if ( matchValue ) {

hibernate-core/src/test/java/org/hibernate/orm/test/mapping/manytoone/jointable/InverseManyToOneJoinTableCompositeIdTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ private void dropTestData(SessionFactoryScope scope) {
132132
session.createQuery( "from Author", Author.class ).list().forEach( session::remove );
133133
} );
134134
scope.inTransaction( (session) -> {
135-
final Long bookCount = session.createSelectionQuery( "select count(1) from Book", Long.class ).uniqueResult();
135+
final Long bookCount = session.createSelectionQuery( "select count(*) from Book", Long.class ).uniqueResult();
136136
assertThat( bookCount ).isEqualTo( 0L );
137137
} );
138138
}

hibernate-core/src/test/java/org/hibernate/orm/test/mapping/manytoone/jointable/InverseManyToOneJoinTableSimpleIdTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ private void dropTestData(SessionFactoryScope scope) {
106106
session.createQuery( "from Author", Author.class ).list().forEach( session::remove );
107107
} );
108108
scope.inTransaction( (session) -> {
109-
final Long bookCount = session.createSelectionQuery( "select count(1) from Book", Long.class ).uniqueResult();
109+
final Long bookCount = session.createSelectionQuery( "select count(*) from Book", Long.class ).uniqueResult();
110110
assertThat( bookCount ).isEqualTo( 0L );
111111
} );
112112
}

0 commit comments

Comments
 (0)