Skip to content

Commit f209ea6

Browse files
VladoKurucyrodiere
authored andcommitted
HHH-19694 Enhanced support for older Informix
1 parent f79de81 commit f209ea6

File tree

9 files changed

+62
-8
lines changed

9 files changed

+62
-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
@@ -473,7 +473,7 @@ protected <T extends JdbcOperation> SqlAstTranslator<T> buildTranslator(
473473
@Override
474474
public String extractPattern(TemporalUnit unit) {
475475
return switch ( unit ) {
476-
case SECOND -> "to_number(to_char(?2,'%S.%F3'))";
476+
case SECOND -> getVersion().isBefore( 11, 70 ) ? "to_number(to_char(?2,'%S%F3'))" : "to_number(to_char(?2,'%S.%F3'))";
477477
case MINUTE -> "to_number(to_char(?2,'%M'))";
478478
case HOUR -> "to_number(to_char(?2,'%H'))";
479479
case DAY_OF_WEEK -> "(weekday(?2)+1)";
@@ -543,8 +543,8 @@ public String getAddPrimaryKeyConstraintString(String constraintName) {
543543

544544
@Override
545545
public String getTruncateTableStatement(String tableName) {
546-
return super.getTruncateTableStatement( tableName )
547-
+ " reuse storage keep statistics";
546+
return super.getTruncateTableStatement( tableName ) + " reuse storage"
547+
+ ( getVersion().isSameOrAfter( 12, 10 ) ? " keep statistics" : "" );
548548
}
549549

550550
@Override
@@ -778,7 +778,7 @@ public boolean isCurrentTimestampSelectStringCallable() {
778778

779779
@Override
780780
public String getCurrentTimestampSelectString() {
781-
return "select sysdate";
781+
return "select sysdate" + (getVersion().isBefore( 12, 10 ) ? " from informix.systables where tabid=1" : "");
782782
}
783783

784784
@Override @SuppressWarnings("deprecation")
@@ -1138,11 +1138,26 @@ public String getDual() {
11381138
return "(select 0 from systables where tabid=1)";
11391139
}
11401140

1141+
@Override
1142+
public String getFromDualForSelectOnly() {
1143+
return getVersion().isBefore( 12,10 ) ? " from " + getDual() + " dual" : "";
1144+
}
1145+
11411146
@Override
11421147
public boolean supportsCrossJoin() {
11431148
return false;
11441149
}
11451150

1151+
@Override
1152+
public boolean supportsIntersect(){
1153+
return getVersion().isSameOrAfter( 12,10 );
1154+
}
1155+
1156+
public boolean supportsSubqueryOnMutatingTable() {
1157+
//tested on version 11.50, 14.10
1158+
return getVersion().isAfter( 11, 50);
1159+
}
1160+
11461161
@Override
11471162
public boolean supportsRowValueConstructorSyntax() {
11481163
return false;
@@ -1158,6 +1173,11 @@ public boolean supportsRowValueConstructorSyntaxInInList() {
11581173
return false;
11591174
}
11601175

1176+
@Override
1177+
public boolean supportsWithClause() {
1178+
return getVersion().isSameOrAfter( 14,10 );
1179+
}
1180+
11611181
@Override
11621182
public boolean requiresColumnListInCreateView() {
11631183
return true;
@@ -1174,6 +1194,6 @@ public IdentifierHelper buildIdentifierHelper(IdentifierHelperBuilder builder, @
11741194

11751195
@Override
11761196
public DmlTargetColumnQualifierSupport getDmlTargetColumnQualifierSupport() {
1177-
return DmlTargetColumnQualifierSupport.TABLE_ALIAS;
1197+
return getVersion().isSameOrAfter( 12,10 ) ? DmlTargetColumnQualifierSupport.TABLE_ALIAS : DmlTargetColumnQualifierSupport.NONE;
11781198
}
11791199
}

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/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/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
}

hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/DialectFeatureChecks.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import org.hibernate.dialect.CockroachDialect;
5252
import org.hibernate.dialect.DB2Dialect;
5353
import org.hibernate.dialect.Dialect;
54+
import org.hibernate.dialect.DmlTargetColumnQualifierSupport;
5455
import org.hibernate.dialect.H2Dialect;
5556
import org.hibernate.dialect.HANADialect;
5657
import org.hibernate.dialect.HSQLDialect;
@@ -1321,6 +1322,13 @@ public boolean apply(Dialect dialect) {
13211322
}
13221323
}
13231324

1325+
public static class SupportsDmlTargetColumnQualifier implements DialectFeatureCheck {
1326+
@Override
1327+
public boolean apply(Dialect dialect) {
1328+
return dialect.getDmlTargetColumnQualifierSupport() != DmlTargetColumnQualifierSupport.NONE;
1329+
}
1330+
}
1331+
13241332
private static SqmFunctionRegistry getSqmFunctionRegistry(Dialect dialect) {
13251333
return getFunctionContributions( dialect ).functionRegistry;
13261334
}

0 commit comments

Comments
 (0)