Skip to content

HHH-19694 Enhanced support for older Informix #10706

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
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 @@ -466,7 +466,7 @@ protected <T extends JdbcOperation> SqlAstTranslator<T> 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)";
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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;
Expand All @@ -1140,6 +1155,11 @@ public boolean supportsRowValueConstructorSyntaxInInList() {
return false;
}

@Override
public boolean supportsWithClause() {
return getVersion().isSameOrAfter( 14,10 );
}

@Override
public boolean requiresColumnListInCreateView() {
return true;
Expand All @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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() );
}
Expand Down Expand Up @@ -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 );
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -683,6 +683,7 @@ public void testFilterApplicationOnHqlQueryWithImplicitSubqueryContainingNamedPa
}

@Test
@RequiresDialectFeature(DialectChecks.SupportsDmlTargetColumnQualifier.class)
public void testFiltersOnSimpleHqlDelete() {
Salesperson sp = new Salesperson();
Salesperson sp2 = new Salesperson();
Expand All @@ -708,6 +709,7 @@ public void testFiltersOnSimpleHqlDelete() {
}

@Test
@RequiresDialectFeature(DialectChecks.SupportsDmlTargetColumnQualifier.class)
public void testFiltersOnMultiTableHqlDelete() {
Salesperson sp = new Salesperson();
Salesperson sp2 = new Salesperson();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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=?";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 );
Expand Down