diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DerbyDialect.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DerbyDialect.java index ca2ba74b9533..8128a77e47fd 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DerbyDialect.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DerbyDialect.java @@ -486,7 +486,10 @@ public String castPattern(CastType from, CastType to) { case FLOAT: case DOUBLE: // Derby can't cast to char directly, but needs to be cast to decimal first... - return "cast(trim(cast(cast(?1 as decimal(" + getDefaultDecimalPrecision() + "," + BigDecimalJavaType.INSTANCE.getDefaultSqlScale( this, null ) + ")) as char(254))) as ?2)"; + return "cast(trim(cast(cast(?1 as decimal(" + + getDefaultDecimalPrecision() + "," + + BigDecimalJavaType.INSTANCE.getDefaultSqlScale( this, null ) + + ")) as char(254))) as ?2)"; case INTEGER: case LONG: case FIXED: 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 26d34aa016f3..c817ad6a8590 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 @@ -24,6 +24,13 @@ import org.hibernate.dialect.NullOrdering; import org.hibernate.dialect.Replacer; import org.hibernate.dialect.SelectItemReferenceStrategy; +import org.hibernate.exception.ConstraintViolationException; +import org.hibernate.exception.LockAcquisitionException; +import org.hibernate.exception.spi.SQLExceptionConversionDelegate; +import org.hibernate.query.sqm.CastType; +import org.hibernate.query.sqm.IntervalType; +import org.hibernate.query.sqm.function.SqmFunctionRegistry; +import org.hibernate.type.BasicType; import org.hibernate.type.descriptor.jdbc.VarcharUUIDJdbcType; import org.hibernate.dialect.function.CaseLeastGreatestEmulation; import org.hibernate.dialect.function.CommonFunctionFactory; @@ -58,7 +65,6 @@ import org.hibernate.query.sqm.mutation.internal.temptable.LocalTemporaryTableMutationStrategy; import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy; import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy; -import org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers; import org.hibernate.query.sqm.sql.SqmTranslator; import org.hibernate.query.sqm.sql.SqmTranslatorFactory; import org.hibernate.query.sqm.sql.StandardSqmTranslatorFactory; @@ -91,7 +97,9 @@ import jakarta.persistence.TemporalType; import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate; +import static org.hibernate.internal.util.JdbcExceptionHelper.extractErrorCode; import static org.hibernate.query.sqm.produce.function.FunctionParameterType.STRING; +import static org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers.impliedOrInvariant; import static org.hibernate.type.SqlTypes.BIGINT; import static org.hibernate.type.SqlTypes.BINARY; import static org.hibernate.type.SqlTypes.FLOAT; @@ -106,14 +114,10 @@ import static org.hibernate.type.SqlTypes.UUID; import static org.hibernate.type.SqlTypes.VARBINARY; import static org.hibernate.type.SqlTypes.VARCHAR; -import static org.hibernate.type.descriptor.DateTimeUtils.JDBC_ESCAPE_END; -import static org.hibernate.type.descriptor.DateTimeUtils.JDBC_ESCAPE_START_DATE; -import static org.hibernate.type.descriptor.DateTimeUtils.JDBC_ESCAPE_START_TIME; -import static org.hibernate.type.descriptor.DateTimeUtils.JDBC_ESCAPE_START_TIMESTAMP; import static org.hibernate.type.descriptor.DateTimeUtils.appendAsDate; import static org.hibernate.type.descriptor.DateTimeUtils.appendAsLocalTime; import static org.hibernate.type.descriptor.DateTimeUtils.appendAsTime; -import static org.hibernate.type.descriptor.DateTimeUtils.appendAsTimestampWithMicros; +import static org.hibernate.type.descriptor.DateTimeUtils.appendAsTimestampWithMillis; /** * Dialect for Informix 7.31.UD3 with Informix @@ -281,8 +285,9 @@ public int getDefaultDecimalPrecision() { @Override public int getDefaultTimestampPrecision() { - //the maximum - return 5; + //the maximum is 5, but default to 3 + //because Informix defaults to milliseconds + return 3; } @Override @@ -329,7 +334,6 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio functionFactory.initcap(); functionFactory.yearMonthDay(); functionFactory.ceiling_ceil(); - functionFactory.concat_pipeOperator(); functionFactory.ascii(); functionFactory.char_chr(); functionFactory.addMonths(); @@ -337,6 +341,21 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio functionFactory.stddev(); functionFactory.variance(); functionFactory.bitLength_pattern( "length(?1)*8" ); + functionFactory.varPop_sumCount(); + + final SqmFunctionRegistry functionRegistry = functionContributions.getFunctionRegistry(); + final TypeConfiguration typeConfiguration = functionContributions.getTypeConfiguration(); + final BasicType stringBasicType = typeConfiguration.getBasicTypeRegistry().resolve( StandardBasicTypes.STRING ); + + functionRegistry.registerAlternateKey( "var_samp", "variance" ); + + // the pipe operator or concat() function returns strings with trailing whitespace + functionRegistry.patternDescriptorBuilder( "concat", "cast(?1||?2... as varchar(255))" ) + .setInvariantType( stringBasicType ) + .setMinArgumentCount( 1 ) + .setArgumentTypeResolver( impliedOrInvariant( typeConfiguration, STRING ) ) + .setArgumentListSignature( "(STRING string0[, STRING string1[, ...]])" ) + .register(); if ( getVersion().isSameOrAfter( 12 ) ) { functionFactory.locate_charindex(); @@ -344,20 +363,12 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio //coalesce() and nullif() both supported since Informix 12 - functionContributions.getFunctionRegistry().register( "least", new CaseLeastGreatestEmulation( true ) ); - functionContributions.getFunctionRegistry().register( "greatest", new CaseLeastGreatestEmulation( false ) ); - functionContributions.getFunctionRegistry().namedDescriptorBuilder( "matches" ) - .setInvariantType( functionContributions.getTypeConfiguration() - .getBasicTypeRegistry() - .resolve( StandardBasicTypes.STRING ) - ) + functionRegistry.register( "least", new CaseLeastGreatestEmulation( true ) ); + functionRegistry.register( "greatest", new CaseLeastGreatestEmulation( false ) ); + functionRegistry.namedDescriptorBuilder( "matches" ) + .setInvariantType( stringBasicType ) .setExactArgumentCount( 2 ) - .setArgumentTypeResolver( - StandardFunctionArgumentTypeResolvers.impliedOrInvariant( - functionContributions.getTypeConfiguration(), - STRING - ) - ) + .setArgumentTypeResolver( impliedOrInvariant( typeConfiguration, STRING ) ) .setArgumentListSignature( "(STRING string, STRING pattern)" ) .register(); if ( supportsWindowFunctions() ) { @@ -420,21 +431,14 @@ protected SqlAstTranslator buildTranslator( */ @Override public String extractPattern(TemporalUnit unit) { - switch (unit) { - case SECOND: - return "to_number(to_char(?2,'%S'))"; - case MINUTE: - return "to_number(to_char(?2,'%M'))"; - case HOUR: - return "to_number(to_char(?2,'%H'))"; - case DAY_OF_WEEK: - return "(weekday(?2)+1)"; - case DAY_OF_MONTH: - return "day(?2)"; - default: - //I think week() returns the ISO week number - return "?1(?2)"; - } + return switch ( unit ) { + case SECOND -> "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)"; + case DAY_OF_MONTH -> "day(?2)"; + default -> "?1(?2)"; + }; } @Override @@ -455,8 +459,7 @@ public String getAddForeignKeyConstraintString( String[] primaryKey, boolean referencesPrimaryKey) { final StringBuilder result = new StringBuilder( 30 ) - .append( " add constraint " ) - .append( " foreign key (" ) + .append( " add constraint foreign key (" ) .append( String.join( ", ", foreignKey ) ) .append( ") references " ) .append( referencedTable ); @@ -541,6 +544,24 @@ public boolean supportsIfExistsBeforeConstraintName() { return getVersion().isSameOrAfter( 11, 70 ); } + @Override + public boolean supportsTableCheck() { + // multi-column check constraints are created using 'alter table' + return false; + } + + @Override + public String getCascadeConstraintsString() { + return getVersion().isSameOrAfter( 12, 10 ) + ? " cascade" + : ""; + } + + @Override + public boolean dropConstraints() { + return !getVersion().isSameOrAfter( 12, 10 ); + } + @Override public boolean supportsOrderByInSubquery() { // This is just a guess @@ -562,6 +583,30 @@ public boolean supportsValuesListForInsert() { return false; } + @Override + public SQLExceptionConversionDelegate buildSQLExceptionConversionDelegate() { + return (sqlException, message, sql) -> + switch ( extractErrorCode( sqlException ) ) { + case -378, -233, -107, -113, -134, -143, -144, -154 -> + //TODO: which of these are these are really LockTimeoutExceptions + // rather than the more generic LockAcquisitionException? + new LockAcquisitionException( message, sqlException, sql ); + case -239, -268 -> + new ConstraintViolationException( message, sqlException, sql, ConstraintViolationException.ConstraintKind.UNIQUE, + getViolatedConstraintNameExtractor().extractConstraintName( sqlException ) ); + case -691, -692 -> + new ConstraintViolationException( message, sqlException, sql, ConstraintViolationException.ConstraintKind.FOREIGN_KEY, + getViolatedConstraintNameExtractor().extractConstraintName( sqlException ) ); + case -703, -391 -> + new ConstraintViolationException( message, sqlException, sql, ConstraintViolationException.ConstraintKind.NOT_NULL, + getViolatedConstraintNameExtractor().extractConstraintName( sqlException ) ); + case -530 -> + new ConstraintViolationException( message, sqlException, sql, ConstraintViolationException.ConstraintKind.CHECK, + getViolatedConstraintNameExtractor().extractConstraintName( sqlException ) ); + default -> null; + }; + } + @Override public ViolatedConstraintNameExtractor getViolatedConstraintNameExtractor() { return EXTRACTOR; @@ -569,39 +614,49 @@ public ViolatedConstraintNameExtractor getViolatedConstraintNameExtractor() { private static final ViolatedConstraintNameExtractor EXTRACTOR = new TemplatedViolatedConstraintNameExtractor( sqle -> { - String constraintName; - switch ( JdbcExceptionHelper.extractErrorCode( sqle ) ) { - case -268: - constraintName = extractUsingTemplate( - "Unique constraint (", - ") violated.", - sqle.getMessage() - ); - break; - case -691: - constraintName = extractUsingTemplate( - "Missing key in referenced table for referential constraint (", - ").", - sqle.getMessage() - ); - break; - case -692: - constraintName = extractUsingTemplate( - "Key value for constraint (", - ") is still being referenced.", - sqle.getMessage() - ); - break; - default: - return null; + final String constraintName = + switch ( JdbcExceptionHelper.extractErrorCode( sqle ) ) { + case -239, -268 -> + extractUsingTemplate( + "Unique constraint (", + ") violated.", + sqle.getMessage() + ); + case -691 -> + extractUsingTemplate( + "Missing key in referenced table for referential constraint (", + ").", + sqle.getMessage() + ); + case -692 -> + extractUsingTemplate( + "Key value for constraint (", + ") is still being referenced.", + sqle.getMessage() + ); + case -530 -> + extractUsingTemplate( + "Check constraint (", + ") failed", + sqle.getMessage() + ); + case -391 -> + extractUsingTemplate( + "null into column (", + ")", + sqle.getMessage() + ); + default -> null; + }; + + if ( constraintName == null ) { + return null; } - - // strip table-owner because Informix always returns constraint names as "." - final int i = constraintName.indexOf( '.' ); - if ( i != -1 ) { - constraintName = constraintName.substring( i + 1 ); + else { + // strip table-owner because Informix always returns constraint names as "." + final int index = constraintName.indexOf( '.' ); + return index > 0 ? constraintName.substring( index + 1 ) : constraintName; } - return constraintName; } ); @Override @@ -626,7 +681,60 @@ public boolean isCurrentTimestampSelectStringCallable() { @Override public String getCurrentTimestampSelectString() { - return "select distinct current timestamp from informix.systables"; + return "select sysdate"; + } + + @Override @SuppressWarnings("deprecation") + public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType, IntervalType intervalType) { + return intervalType != null ? "(?2 + ?3)" : "(?3 + " + intervalPattern( unit ) + ")"; + } + + private static String intervalPattern(TemporalUnit unit) { + return switch (unit) { + case NANOSECOND -> "?2/1e9 * interval (1) second to fraction"; + case NATIVE, SECOND -> "?2 * interval (1) second to fraction"; + case QUARTER -> "?2 * interval (3) month to month"; + case WEEK -> "?2 * interval (7) day to day"; + default -> "?2 * interval (1) " + unit + " to " + unit; + }; + } + + @Override + public long getFractionalSecondPrecisionInNanos() { + // Informix actually supports up to 10 microseconds + // but defaults to milliseconds (so use that) + return 1_000_000; + } + + @Override @SuppressWarnings("deprecation") + public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalType, TemporalType toTemporalType) { + return unit == null + ? "(?3-?2)" + : extractPattern( unit ) + .replace( "?1", unit.toString() ) + .replace( "?2", "?3-?2" ); + } + + @Override + public String castPattern(CastType from, CastType to) { + if ( from == CastType.BOOLEAN ) { + switch ( to ) { + case STRING: + return "trim(case ?1 when 't' then 'true' when 'f' then 'false' else null end)"; + case TF_BOOLEAN: + return "upper(cast(?1 as varchar))"; + case YN_BOOLEAN: + return "case ?1 when 't' then 'Y' when 'f' then 'N' else null end"; + case INTEGER_BOOLEAN: + return "case ?1 when 't' then 1 when 'f' then 0 else null end"; + } + } + return super.castPattern( from, to ); + } + + @Override + public void appendBinaryLiteral(SqlAppender appender, byte[] bytes) { + throw new UnsupportedOperationException( "Informix does not support binary literals" ); } @Override @@ -726,7 +834,9 @@ public Exporter getTableExporter() { @Override public void appendBooleanValueString(SqlAppender appender, boolean bool) { + appender.appendSql( "cast(" ); appender.appendSql( bool ? "'t'" : "'f'" ); + appender.appendSql( " as boolean)" ); } @Override @@ -736,7 +846,7 @@ public String currentDate() { @Override public String currentTime() { - return currentTimestamp(); + return "current hour to fraction"; } @Override @@ -813,21 +923,19 @@ public void appendDateTimeLiteral( TemporalAccessor temporalAccessor, TemporalType precision, TimeZone jdbcTimeZone) { + appender.append( "datetime (" ); switch ( precision ) { case DATE: - appender.appendSql( JDBC_ESCAPE_START_DATE ); appendAsDate( appender, temporalAccessor ); - appender.appendSql( JDBC_ESCAPE_END ); + appender.appendSql( ") year to day" ); break; case TIME: - appender.appendSql( JDBC_ESCAPE_START_TIME ); appendAsTime( appender, temporalAccessor, supportsTemporalLiteralOffset(), jdbcTimeZone ); - appender.appendSql( JDBC_ESCAPE_END ); + appender.appendSql( ") hour to fraction" ); break; case TIMESTAMP: - appender.appendSql( JDBC_ESCAPE_START_TIMESTAMP ); - appendAsTimestampWithMicros( appender, temporalAccessor, supportsTemporalLiteralOffset(), jdbcTimeZone ); - appender.appendSql( JDBC_ESCAPE_END ); + appendAsTimestampWithMillis( appender, temporalAccessor, supportsTemporalLiteralOffset(), jdbcTimeZone ); + appender.appendSql( ") year to fraction" ); break; default: throw new IllegalArgumentException(); @@ -836,21 +944,19 @@ public void appendDateTimeLiteral( @Override public void appendDateTimeLiteral(SqlAppender appender, Date date, TemporalType precision, TimeZone jdbcTimeZone) { + appender.append( "datetime (" ); switch ( precision ) { case DATE: - appender.appendSql( JDBC_ESCAPE_START_DATE ); appendAsDate( appender, date ); - appender.appendSql( JDBC_ESCAPE_END ); + appender.appendSql( ") year to day" ); break; case TIME: - appender.appendSql( JDBC_ESCAPE_START_TIME ); appendAsLocalTime( appender, date ); - appender.appendSql( JDBC_ESCAPE_END ); + appender.appendSql( ") hour to fraction" ); break; case TIMESTAMP: - appender.appendSql( JDBC_ESCAPE_START_TIMESTAMP ); - appendAsTimestampWithMicros( appender, date, jdbcTimeZone ); - appender.appendSql( JDBC_ESCAPE_END ); + appendAsTimestampWithMillis( appender, date, jdbcTimeZone ); + appender.appendSql( ") year to fraction" ); break; default: throw new IllegalArgumentException(); @@ -859,17 +965,22 @@ public void appendDateTimeLiteral(SqlAppender appender, Date date, TemporalType @Override public String getSelectClauseNullString(int sqlType, TypeConfiguration typeConfiguration) { - DdlType descriptor = typeConfiguration.getDdlTypeRegistry().getDescriptor( sqlType ); + final DdlType descriptor = typeConfiguration.getDdlTypeRegistry().getDescriptor( sqlType ); if ( descriptor == null ) { - return "null"; + // just cast it to an arbitrary SQL type, + // which we expect to be ignored by higher layers + return "null::int"; + } + else { + return "null::" + castType( descriptor ); } - String typeName = descriptor.getTypeName( Size.length( Size.DEFAULT_LENGTH ) ); + } + + private static String castType(DdlType descriptor) { + final String typeName = descriptor.getTypeName( Size.length( Size.DEFAULT_LENGTH ) ); //trim off the length/precision/scale final int loc = typeName.indexOf( '(' ); - if ( loc > -1 ) { - typeName = typeName.substring( 0, loc ); - } - return "null::" + typeName; + return loc < 0 ? typeName : typeName.substring( 0, loc ); } @Override @@ -906,11 +1017,6 @@ public String getDual() { return "(select 0 from systables where tabid=1)"; } - @Override - public String getFromDualForSelectOnly() { - return " from " + getDual() + " dual"; - } - @Override public boolean supportsRowValueConstructorSyntax() { return false; @@ -926,4 +1032,8 @@ public boolean supportsRowValueConstructorSyntaxInInList() { return false; } + @Override + public boolean requiresColumnListInCreateView() { + return true; + } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java index 6bfaaf54b250..f7a78fa68c0f 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java @@ -2927,12 +2927,23 @@ public String getCrossReferenceParentTableFilter(){ * The syntax used to add a primary key constraint to a table. * * @param constraintName The name of the PK constraint. - * @return The "add PK" fragment + * + * @apiNote Currently unused, since we never use {@code alter table} + * to add a primary key constraint. */ public String getAddPrimaryKeyConstraintString(String constraintName) { return " add constraint " + constraintName + " primary key "; } + /** + * Is a list of column names required in the {@code create view} statement? + * + * @since 7.1 + */ + public boolean requiresColumnListInCreateView() { + return false; + } + /** * The {@link SqmMultiTableMutationStrategy} to use when not specified by * {@link org.hibernate.query.spi.QueryEngineOptions#getCustomSqmMultiTableMutationStrategy}. diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/CommonFunctionFactory.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/CommonFunctionFactory.java index 92828d64129a..e1ed5a09f6d8 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/CommonFunctionFactory.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/CommonFunctionFactory.java @@ -421,8 +421,8 @@ public void stddev() { /** * Warning: the semantics of this function are inconsistent between DBs. *
    - *
  • On Postgres it means {@code var_samp()} - *
  • On Oracle, DB2, MySQL it means {@code var_pop()} + *
  • On Postgres and Informix it means {@code var_samp()} (the unbiased estimator) + *
  • On Oracle, DB2, MySQL it means {@code var_pop()} (the MLE) *
*/ public void variance() { @@ -505,8 +505,17 @@ public void varianceSamp() { .register(); } + private static final String VAR_POP_SUM_COUNT_PATTERN = "(sum(power(?1,2))-(power(sum(?1),2)/count(?1)))/nullif(count(?1),0)"; private static final String VAR_SAMP_SUM_COUNT_PATTERN = "(sum(power(?1,2))-(power(sum(?1),2)/count(?1)))/nullif(count(?1)-1,0)"; + public void varPop_sumCount() { + functionRegistry.patternAggregateDescriptorBuilder( "var_pop", VAR_POP_SUM_COUNT_PATTERN ) + .setInvariantType( doubleType ) + .setExactArgumentCount( 1 ) + .setParameterTypes( NUMERIC ) + .register(); + } + /** * DB2 before 11 */ diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java index d140524d8bd0..61d406ac2f2d 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java @@ -8034,11 +8034,7 @@ public void visitLikePredicate(LikePredicate likePredicate) { appendSql( " not" ); } appendSql( " like " ); - likePredicate.getPattern().accept( this ); - if ( likePredicate.getEscapeCharacter() != null ) { - appendSql( " escape " ); - likePredicate.getEscapeCharacter().accept( this ); - } + renderLikePredicate( likePredicate ); } else { if ( dialect.supportsCaseInsensitiveLike() ) { @@ -8049,11 +8045,7 @@ public void visitLikePredicate(LikePredicate likePredicate) { appendSql( WHITESPACE ); appendSql( dialect.getCaseInsensitiveLike() ); appendSql( WHITESPACE ); - likePredicate.getPattern().accept( this ); - if ( likePredicate.getEscapeCharacter() != null ) { - appendSql( " escape " ); - likePredicate.getEscapeCharacter().accept( this ); - } + renderLikePredicate( likePredicate ); } else { renderCaseInsensitiveLikeEmulation(likePredicate.getMatchExpression(), likePredicate.getPattern(), likePredicate.getEscapeCharacter(), likePredicate.isNegated()); @@ -8061,6 +8053,14 @@ public void visitLikePredicate(LikePredicate likePredicate) { } } + protected void renderLikePredicate(LikePredicate likePredicate) { + likePredicate.getPattern().accept( this ); + if ( likePredicate.getEscapeCharacter() != null ) { + appendSql( " escape " ); + likePredicate.getEscapeCharacter().accept( this ); + } + } + protected void renderCaseInsensitiveLikeEmulation(Expression lhs, Expression rhs, Expression escapeCharacter, boolean negated) { //LOWER(lhs) operator LOWER(rhs) appendSql( dialect.getLowercaseFunction() ); @@ -8147,13 +8147,11 @@ protected void appendBackslashEscapedLikeLiteral(SqlAppender appender, String li @Override public void visitNegatedPredicate(NegatedPredicate negatedPredicate) { - if ( negatedPredicate.isEmpty() ) { - return; + if ( !negatedPredicate.isEmpty() ) { + appendSql( "not(" ); + negatedPredicate.getPredicate().accept( this ); + appendSql( CLOSE_PARENTHESIS ); } - - appendSql( "not(" ); - negatedPredicate.getPredicate().accept( this ); - appendSql( CLOSE_PARENTHESIS ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java index 6d4001aed3b0..6fdd8ed162cd 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java @@ -33,6 +33,7 @@ import org.hibernate.type.SqlTypes; import static java.util.Collections.addAll; +import static java.util.Comparator.comparing; import static org.hibernate.internal.util.StringHelper.EMPTY_STRINGS; import static org.hibernate.tool.schema.internal.ColumnDefinitions.appendColumn; @@ -64,8 +65,26 @@ public String[] getSqlCreateStrings( final String viewQuery = table.getViewQuery(); if ( viewQuery != null ) { createTable.append("create view ") - .append( formattedTableName ) - .append(" as ") + .append( formattedTableName ); + if ( dialect.requiresColumnListInCreateView() ) { + createTable.append(" ("); + var sortedColumns = + table.getColumns().stream() + .sorted( comparing( c -> viewQuery.indexOf( c.getQuotedName( dialect ) ) ) ) + .toList(); + boolean isFirst = true; + for ( Column column : sortedColumns ) { + if ( isFirst ) { + isFirst = false; + } + else { + createTable.append( ", " ); + } + createTable.append( column.getQuotedName( dialect ) ); + } + createTable.append(")"); + } + createTable.append(" as ") .append( viewQuery ); } else { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/manytoonewithformula/ManyToOneWithFormulaTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/manytoonewithformula/ManyToOneWithFormulaTest.java index 85bf051601a5..519ae2c9a9d5 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/manytoonewithformula/ManyToOneWithFormulaTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/manytoonewithformula/ManyToOneWithFormulaTest.java @@ -5,6 +5,7 @@ package org.hibernate.orm.test.annotations.manytoonewithformula; import org.hibernate.community.dialect.AltibaseDialect; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.HSQLDialect; import org.hibernate.dialect.OracleDialect; import org.hibernate.dialect.SQLServerDialect; @@ -22,7 +23,6 @@ /** * @author Sharath Reddy */ -@SuppressWarnings("JUnitMalformedDeclaration") public class ManyToOneWithFormulaTest { @Test @DomainModel( annotatedClasses = { Menu.class, FoodItem.class } ) @@ -148,8 +148,9 @@ public void testReferencedColumnNameBelongsToEmbeddedIdOfReferencedEntity(Sessio @Test @DomainModel( annotatedClasses = Product.class ) @SessionFactory - @SkipForDialect( dialectClass =HSQLDialect.class, reason = "The used join conditions does not work in HSQLDB. See HHH-4497." ) - @SkipForDialect( dialectClass = OracleDialect.class, reason = "Oracle do not support 'substring' function" ) + @SkipForDialect( dialectClass = HSQLDialect.class, reason = "The used join conditions does not work in HSQLDB. See HHH-4497." ) + @SkipForDialect( dialectClass = OracleDialect.class, reason = "Oracle do not support 'substring' function JDBC escape" ) + @SkipForDialect( dialectClass = InformixDialect.class, reason = "Oracle do not support 'substring' function JDBC escape" ) @SkipForDialect( dialectClass = AltibaseDialect.class, reason = " Altibase char type returns with trailing spaces") public void testManyToOneFromNonPkToNonPk(SessionFactoryScope scope) { // also tests usage of the stand-alone @JoinFormula annotation diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/subselect/HighestBid.java b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/subselect/HighestBid.java index dceb184fac79..105225fd0ed7 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/subselect/HighestBid.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/subselect/HighestBid.java @@ -14,7 +14,7 @@ * */ @Entity -@Subselect("select Item.name as name, max(Bid.amount) as amount from Item, Bid where Bid.itemId = Item.id group by Item.name") +@Subselect("select i.name as name, max(b.amount) as amount from Item i, Bid b where b.itemId = i.id group by i.name") @Synchronize({"Item", "Bid"}) public class HighestBid { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/subselect/SubselectTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/subselect/SubselectTest.java index 886cda7031b3..863bc5afde39 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/subselect/SubselectTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/subselect/SubselectTest.java @@ -7,7 +7,6 @@ import org.junit.Assert; import org.junit.Test; -import org.hibernate.query.Query; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; @@ -45,15 +44,13 @@ public void testSubselectWithSynchronize() { s.persist(bid2); //Because we use 'synchronize' annotation, this query should trigger session flush - Query query = s.createQuery("from HighestBid b where b.name = :name"); + var query = s.createQuery("from HighestBid b where b.name = :name", HighestBid.class); query.setParameter( "name", "widget", StandardBasicTypes.STRING ); - HighestBid highestBid = (HighestBid) query.list().iterator().next(); + HighestBid highestBid = query.list().iterator().next(); Assert.assertEquals( 200.0, highestBid.getAmount(), 0.01 ); tx.rollback(); s.close(); - - } @Override diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/constraint/ConstraintInterpretationTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/constraint/ConstraintInterpretationTest.java index 3c35e65e098e..0bb54166691c 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/constraint/ConstraintInterpretationTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/constraint/ConstraintInterpretationTest.java @@ -13,6 +13,7 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import jakarta.persistence.UniqueConstraint; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.DB2Dialect; import org.hibernate.dialect.H2Dialect; import org.hibernate.dialect.HSQLDialect; @@ -44,6 +45,7 @@ @RequiresDialect( SybaseASEDialect.class ) @RequiresDialect( OracleDialect.class ) @RequiresDialect( DB2Dialect.class ) +@RequiresDialect( InformixDialect.class ) @SkipForDialect(dialectClass = MariaDBDialect.class) // Maria doesn't allow named column-level check constraints public class ConstraintInterpretationTest { @Test void testNotNullPrimaryKey(EntityManagerFactoryScope scope) { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/constraint/ConstraintInterpretationTest2.java b/hibernate-core/src/test/java/org/hibernate/orm/test/constraint/ConstraintInterpretationTest2.java index 487731b31748..d4df3d37765d 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/constraint/ConstraintInterpretationTest2.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/constraint/ConstraintInterpretationTest2.java @@ -13,6 +13,7 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import jakarta.persistence.UniqueConstraint; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.DB2Dialect; import org.hibernate.dialect.H2Dialect; import org.hibernate.dialect.HANADialect; @@ -26,6 +27,7 @@ import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.Jpa; import org.hibernate.testing.orm.junit.RequiresDialect; +import org.hibernate.testing.orm.junit.SkipForDialect; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -43,6 +45,7 @@ @RequiresDialect( OracleDialect.class ) @RequiresDialect( DB2Dialect.class ) @RequiresDialect( HANADialect.class ) +@RequiresDialect( InformixDialect.class ) public class ConstraintInterpretationTest2 { @Test void testNotNullPrimaryKey(EntityManagerFactoryScope scope) { scope.inTransaction( em -> { @@ -99,6 +102,9 @@ public class ConstraintInterpretationTest2 { } } ); } + + @SkipForDialect(dialectClass = InformixDialect.class, + reason = "multi-column check constraints must be created using 'alter table', and we don't have a StandardCheckConstraintExporter") @Test void testCheck(EntityManagerFactoryScope scope) { scope.inTransaction( em -> { try { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/datasource/DataSourceTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/datasource/DataSourceTest.java index 38de63ed4915..0873edca1fbc 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/datasource/DataSourceTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/datasource/DataSourceTest.java @@ -8,7 +8,9 @@ import jakarta.persistence.Id; import org.hibernate.cfg.Environment; import org.hibernate.cfg.JdbcSettings; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.DB2Dialect; +import org.hibernate.dialect.Dialect; import org.hibernate.dialect.OracleDialect; import org.hibernate.internal.log.ConnectionInfoLogger; import org.hibernate.testing.logger.LogInspectionHelper; @@ -35,7 +37,9 @@ void test(EntityManagerFactoryScope scope) { LogInspectionHelper.registerListener( listener, ConnectionInfoLogger.INSTANCE ); scope.getEntityManagerFactory(); LogInspectionHelper.clearAllListeners( ConnectionInfoLogger.INSTANCE ); - assertTrue( scope.getDialect() instanceof OracleDialect dialect && dialect.isAutonomous() + Dialect dialect = scope.getDialect(); + assertTrue( dialect instanceof OracleDialect od && od.isAutonomous() + || dialect instanceof InformixDialect // Informix metadata does not include the URL || listener.seen ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/filter/FilterParameterTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/filter/FilterParameterTests.java index 1b1edcb6ce7c..698ebdb9ce9b 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/filter/FilterParameterTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/filter/FilterParameterTests.java @@ -21,6 +21,7 @@ import org.hibernate.cfg.AvailableSettings; import org.hibernate.community.dialect.AltibaseDialect; import org.hibernate.community.dialect.FirebirdDialect; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.HANADialect; import org.hibernate.dialect.CockroachDialect; import org.hibernate.dialect.DB2Dialect; @@ -105,6 +106,7 @@ public void testYesNo(BiConsumer> inTransaction) { scope.inTransaction( (session) -> { session.disableFilter( "subDepartmentFilter" ); @@ -158,6 +160,7 @@ public void testNumeric(BiConsumer> inTransaction) { scope.inTransaction( (session) -> { session.disableFilter( "subDepartmentFilter" ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/hql/CoalesceTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/hql/CoalesceTest.java index 3b8464bbd776..67d542b77fe3 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/hql/CoalesceTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/hql/CoalesceTest.java @@ -4,11 +4,13 @@ */ package org.hibernate.orm.test.hql; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.testing.orm.domain.gambit.EntityOfBasics; import org.hibernate.testing.orm.junit.DomainModel; import org.hibernate.testing.orm.junit.JiraKey; import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactoryScope; +import org.hibernate.testing.orm.junit.SkipForDialect; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -20,10 +22,11 @@ /** * @author Johannes Buehler */ -@SuppressWarnings("JUnitMalformedDeclaration") @JiraKey( value = "HHH-10463") @DomainModel(annotatedClasses = org.hibernate.testing.orm.domain.gambit.EntityOfBasics.class) @SessionFactory +@SkipForDialect(dialectClass = InformixDialect.class, + reason = "Informix does not allow JDBC parameters as arguments to the COALESCE function (not even with a cast)") public class CoalesceTest { final String QRY_STR = "from EntityOfBasics e where e.theString = coalesce(:p , e.theString)"; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/hql/FunctionNameAsColumnTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/hql/FunctionNameAsColumnTest.java index efabc6624db8..0da1c254ceb7 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/hql/FunctionNameAsColumnTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/hql/FunctionNameAsColumnTest.java @@ -15,11 +15,12 @@ import org.hibernate.Session; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Environment; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.PostgresPlusDialect; import org.hibernate.dialect.SybaseASEDialect; -import org.hibernate.testing.SkipForDialect; import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; +import org.hibernate.testing.orm.junit.SkipForDialect; import org.junit.After; import org.junit.Assume; import org.junit.Test; @@ -33,8 +34,9 @@ * * @author Gail Badner */ -@SkipForDialect(value = SybaseASEDialect.class, jiraKey = "HHH-6426") -@SkipForDialect(value = PostgresPlusDialect.class, comment = "Almost all of the tests result in 'ambiguous column' errors.") +@SkipForDialect(dialectClass = SybaseASEDialect.class, reason = "HHH-6426") +@SkipForDialect(dialectClass = PostgresPlusDialect.class, + reason = "Almost all of the tests result in 'ambiguous column' errors.") public class FunctionNameAsColumnTest extends BaseCoreFunctionalTestCase { @Override protected String getBaseForMappings() { @@ -200,6 +202,7 @@ public void testGetMultiColumnSameNameAsArgFunctionCriteria() { } @Test + @SkipForDialect(dialectClass = InformixDialect.class, reason = "Ambiguous column") public void testGetMultiColumnSameNameAsNoArgFunctionHQL() { Assume.assumeFalse( "current_date requires () but test is for noarg function that does not require ()", @@ -254,6 +257,7 @@ public void testGetMultiColumnSameNameAsNoArgFunctionHQL() { } @Test + @SkipForDialect(dialectClass = InformixDialect.class, reason = "Ambiguous column") public void testGetMultiColumnSameNameAsNoArgFunctionCriteria() { Assume.assumeFalse( "current_date requires () but test is for noarg function that does not require ()", diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CoalesceTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CoalesceTest.java index 4170e6047fbc..bd0a515561f5 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CoalesceTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CoalesceTest.java @@ -7,11 +7,13 @@ import java.math.BigDecimal; import java.util.List; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.testing.orm.junit.JiraKey; import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.Jira; import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.SkipForDialect; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -42,6 +44,8 @@ @JiraKey( value = "HHH-15291") public class CoalesceTest { @Test + @SkipForDialect(dialectClass = InformixDialect.class, + reason = "Informix does not support parameters in COALESCE" ) public void hhh15291JPQL1Test(EntityManagerFactoryScope scope) { scope.inEntityManager( entityManager -> { @@ -57,6 +61,8 @@ public void hhh15291JPQL1Test(EntityManagerFactoryScope scope) { } @Test + @SkipForDialect(dialectClass = InformixDialect.class, + reason = "Informix does not support parameters in COALESCE" ) public void hhh15291JPQL2Test(EntityManagerFactoryScope scope) { scope.inEntityManager( entityManager -> { @@ -65,11 +71,14 @@ public void hhh15291JPQL2Test(EntityManagerFactoryScope scope) { String.class ); query2.setParameter( 1, "Sample" ); + query2.getResultList(); } ); } @Test + @SkipForDialect(dialectClass = InformixDialect.class, + reason = "Informix does not support parameters in COALESCE" ) public void hhh15291Criteria1Test(EntityManagerFactoryScope scope) { scope.inEntityManager( entityManager -> { @@ -90,6 +99,8 @@ public void hhh15291Criteria1Test(EntityManagerFactoryScope scope) { } @Test + @SkipForDialect(dialectClass = InformixDialect.class, + reason = "Informix does not support parameters in COALESCE" ) public void hhh15291Criteria2Test(EntityManagerFactoryScope scope) { scope.inEntityManager( entityManager -> { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ConcatTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ConcatTest.java index 73358c7b2939..40e03396d68c 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ConcatTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ConcatTest.java @@ -23,7 +23,7 @@ import org.hibernate.testing.orm.junit.JiraKey; import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; /** * @author Andrea Boriero @@ -58,7 +58,7 @@ public void setUp() { } @Test - public void testSelectCaseWithConcat() throws Exception { + public void testSelectCaseWithConcat() { EntityManager entityManager = getOrCreateEntityManager(); entityManager.getTransaction().begin(); try { @@ -91,7 +91,7 @@ public void testSelectCaseWithConcat() throws Exception { } @Test - public void testConcat() throws Exception { + public void testConcat() { EntityManager entityManager = getOrCreateEntityManager(); entityManager.getTransaction().begin(); try { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryTest.java index e601476775b5..3a36f15fca91 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryTest.java @@ -25,6 +25,7 @@ import org.hibernate.Hibernate; import org.hibernate.QueryException; import org.hibernate.cfg.AvailableSettings; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.CockroachDialect; import org.hibernate.dialect.DB2Dialect; import org.hibernate.community.dialect.DerbyDialect; @@ -383,6 +384,7 @@ public Class getParameterType() { @SkipForDialect(value = PostgreSQLDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") @SkipForDialect(value = PostgresPlusDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") @SkipForDialect(value = CockroachDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(value = InformixDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") public void testNativeQueryNullPositionalParameter() throws Exception { EntityManager em = getOrCreateEntityManager(); em.getTransaction().begin(); @@ -418,6 +420,7 @@ public void testNativeQueryNullPositionalParameter() throws Exception { @SkipForDialect(value = PostgreSQLDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") @SkipForDialect(value = PostgresPlusDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") @SkipForDialect(value = CockroachDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(value = InformixDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") public void testNativeQueryNullPositionalParameterParameter() throws Exception { EntityManager em = getOrCreateEntityManager(); em.getTransaction().begin(); @@ -469,6 +472,7 @@ public Class getParameterType() { @SkipForDialect(value = PostgreSQLDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") @SkipForDialect(value = PostgresPlusDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") @SkipForDialect(value = CockroachDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(value = InformixDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") public void testNativeQueryNullNamedParameter() throws Exception { EntityManager em = getOrCreateEntityManager(); em.getTransaction().begin(); @@ -504,6 +508,7 @@ public void testNativeQueryNullNamedParameter() throws Exception { @SkipForDialect(value = PostgreSQLDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") @SkipForDialect(value = PostgresPlusDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") @SkipForDialect(value = CockroachDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(value = InformixDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") public void testNativeQueryNullNamedParameterParameter() throws Exception { EntityManager em = getOrCreateEntityManager(); em.getTransaction().begin(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/lob/LobStringFunctionsTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/lob/LobStringFunctionsTest.java index da26fcae52f6..cb4e76e5d4ba 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/lob/LobStringFunctionsTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/lob/LobStringFunctionsTest.java @@ -7,12 +7,14 @@ import java.sql.Clob; import java.util.List; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.query.Query; import org.hibernate.testing.orm.junit.JiraKey; import org.hibernate.testing.orm.junit.DomainModel; import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactoryScope; +import org.hibernate.testing.orm.junit.SkipForDialect; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -34,6 +36,7 @@ annotatedClasses = LobStringFunctionsTest.TestEntity.class ) @SessionFactory +@SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix does not allow these functions for LOBs") public class LobStringFunctionsTest { private static final int LONG_STRING_SIZE = 3999; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generated/sql/ImmutableSqlGeneratedTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generated/sql/ImmutableSqlGeneratedTest.java index a7801b6602e2..df2a6d92f804 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generated/sql/ImmutableSqlGeneratedTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generated/sql/ImmutableSqlGeneratedTest.java @@ -8,6 +8,7 @@ import jakarta.persistence.Id; import org.hibernate.annotations.Generated; import org.hibernate.annotations.Immutable; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.SybaseASEDialect; import org.hibernate.generator.EventType; import org.hibernate.testing.orm.junit.DomainModel; @@ -20,18 +21,19 @@ import java.math.BigDecimal; import java.time.LocalDateTime; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotSame; /** * @author Gavin King */ -@SuppressWarnings("JUnitMalformedDeclaration") @DomainModel(annotatedClasses = ImmutableSqlGeneratedTest.OrderLine.class) @SessionFactory @SkipForDialect(dialectClass = SybaseASEDialect.class, reason = "The name 'current_timestamp' is illegal in this context. Only constants, constant expressions, or variables allowed here.") +@SkipForDialect( dialectClass = InformixDialect.class, + reason = "No 'current_timestamp' function on Informix") public class ImmutableSqlGeneratedTest { @Test @@ -65,7 +67,7 @@ public void test(SessionFactoryScope scope) { entity.status = "old"; session.flush(); assertNotNull( entity.updated ); - assertFalse( previous == entity.updated ); + assertNotSame( previous, entity.updated ); } ); scope.inTransaction( session -> { OrderLine entity = session.createQuery("from WithDefault", OrderLine.class ).getSingleResult(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generated/sql/SqlGeneratedTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generated/sql/SqlGeneratedTest.java index 9bd991d7ae40..28c6cb2ddad8 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generated/sql/SqlGeneratedTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generated/sql/SqlGeneratedTest.java @@ -7,6 +7,7 @@ import jakarta.persistence.Entity; import jakarta.persistence.Id; import org.hibernate.annotations.Generated; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.SybaseASEDialect; import org.hibernate.generator.EventType; import org.hibernate.testing.orm.junit.DomainModel; @@ -26,11 +27,12 @@ /** * @author Gavin King */ -@SuppressWarnings("JUnitMalformedDeclaration") @DomainModel(annotatedClasses = SqlGeneratedTest.OrderLine.class) @SessionFactory @SkipForDialect(dialectClass = SybaseASEDialect.class, reason = "The name 'current_timestamp' is illegal in this context. Only constants, constant expressions, or variables allowed here.") +@SkipForDialect( dialectClass = InformixDialect.class, + reason = "No 'current_timestamp' function on Informix (test passes with 'current')") public class SqlGeneratedTest { @Test diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/onetoone/singletable/SingleTableOneToOneTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/onetoone/singletable/SingleTableOneToOneTest.java index 48ec54686eb4..feca29bb82ea 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/onetoone/singletable/SingleTableOneToOneTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/onetoone/singletable/SingleTableOneToOneTest.java @@ -6,6 +6,7 @@ import java.util.List; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.SybaseDialect; import org.hibernate.exception.ConstraintViolationException; @@ -55,7 +56,10 @@ public void tearDown(SessionFactoryScope scope) { } @Test - @SkipForDialect(dialectClass = SybaseDialect.class, matchSubTypes = true, reason = "Sybase ignores unique constraints on nullable columns") + @SkipForDialect(dialectClass = SybaseDialect.class, matchSubTypes = true, + reason = "SybaseDialect ignores unique constraints on nullable columns") + @SkipForDialect(dialectClass = InformixDialect.class, matchSubTypes = true, + reason = "InformixDialect ignores unique constraints on nullable columns") public void testMultipleRelationshipsOnSingleTableInheritanceWronglyMappedAsOneToOne(SessionFactoryScope scope) { assertThrows( ConstraintViolationException.class, diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/CountExpressionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/CountExpressionTest.java index c4af711b75da..a3be60506bf6 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/CountExpressionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/CountExpressionTest.java @@ -15,8 +15,10 @@ import jakarta.persistence.MapKeyColumn; import jakarta.persistence.OneToMany; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.testing.orm.junit.JiraKey; import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; +import org.hibernate.testing.orm.junit.SkipForDialect; import org.junit.Test; import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate; @@ -87,6 +89,8 @@ public void testCountDistinctExpression() { @Test @JiraKey(value = "HHH-11042") + @SkipForDialect(dialectClass = InformixDialect.class, + reason = "Informix allows only one column in count(distinct)") public void testCountDistinctTuple() { doInHibernate( this::sessionFactory, session -> { List results = session.createQuery( @@ -108,6 +112,8 @@ public void testCountDistinctTuple() { @Test @JiraKey(value = "HHH-11042") + @SkipForDialect(dialectClass = InformixDialect.class, + reason = "Informix allows only one column in count(distinct)") public void testCountDistinctTupleSanity() { doInHibernate( this::sessionFactory, session -> { // A simple concatenation of tuple arguments would produce a distinct count of 1 in this case diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/FunctionTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/FunctionTests.java index 6a63b11e78ed..431fec0e043a 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/FunctionTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/FunctionTests.java @@ -1024,7 +1024,7 @@ public void testCastFunction(SessionFactoryScope scope) { assertThat( session.createQuery("select cast('1911-10-09 12:13:14.123' as Timestamp)", Timestamp.class).getSingleResult(), instanceOf(Timestamp.class) ); assertThat( session.createQuery("select cast(date 1911-10-09 as String)", String.class).getSingleResult(), is("1911-10-09") ); - assertThat( session.createQuery("select cast(time 12:13:14 as String)", String.class).getSingleResult(), anyOf( is("12:13:14"), is("12:13:14.0000"), is("12.13.14") ) ); + assertThat( session.createQuery("select cast(time 12:13:14 as String)", String.class).getSingleResult(), anyOf( is("12:13:14"), is("12:13:14.0000"), is("12:13:14.000"), is("12.13.14") ) ); assertThat( session.createQuery("select cast(datetime 1911-10-09 12:13:14 as String)", String.class).getSingleResult(), anyOf( startsWith("1911-10-09 12:13:14"), startsWith("1911-10-09-12.13.14") ) ); assertThat( session.createQuery("select cast(local datetime as Instant)", Instant.class).getSingleResult(), instanceOf(Instant.class) ); @@ -1224,7 +1224,7 @@ public void testStrFunction(SessionFactoryScope scope) { .list(); assertThat( session.createQuery("select str(69)", String.class).getSingleResult(), is("69") ); assertThat( session.createQuery("select str(date 1911-10-09)", String.class).getSingleResult(), is("1911-10-09") ); - assertThat( session.createQuery("select str(time 12:13:14)", String.class).getSingleResult(), anyOf( is( "12:13:14"), is( "12:13:14.0000"), is( "12.13.14") ) ); + assertThat( session.createQuery("select str(time 12:13:14)", String.class).getSingleResult(), anyOf( is( "12:13:14"), is( "12:13:14.0000"), is( "12:13:14.000"), is( "12.13.14") ) ); } ); } @@ -2078,11 +2078,6 @@ public void testExtractFunction(SessionFactoryScope scope) { session.createQuery("select extract(day from e.theDate) from EntityOfBasics e", Integer.class) .list(); - session.createQuery("select extract(day of year from e.theDate) from EntityOfBasics e", Integer.class) - .list(); - session.createQuery("select extract(day of month from e.theDate) from EntityOfBasics e", Integer.class) - .list(); - session.createQuery("select extract(quarter from e.theDate) from EntityOfBasics e", Integer.class) .list(); @@ -2113,11 +2108,6 @@ public void testExtractFunction(SessionFactoryScope scope) { session.createQuery("select extract(time from local datetime), extract(date from local datetime) from EntityOfBasics e", Object[].class) .list(); - session.createQuery("select extract(week of month from current date) from EntityOfBasics e", Integer.class) - .list(); - session.createQuery("select extract(week of year from current date) from EntityOfBasics e", Integer.class) - .list(); - assertThat( session.createQuery("select extract(year from date 1974-03-25)", Integer.class).getSingleResult(), is(1974) ); assertThat( session.createQuery("select extract(month from date 1974-03-25)", Integer.class).getSingleResult(), is(3) ); assertThat( session.createQuery("select extract(day from date 1974-03-25)", Integer.class).getSingleResult(), is(25) ); @@ -2128,6 +2118,24 @@ public void testExtractFunction(SessionFactoryScope scope) { ); } + @Test + public void testExtractFunctionDayOfWeekOf(SessionFactoryScope scope) { + scope.inTransaction( + session -> { + session.createQuery("select extract(day of year from e.theDate) from EntityOfBasics e", Integer.class) + .list(); + session.createQuery("select extract(day of month from e.theDate) from EntityOfBasics e", Integer.class) + .list(); + + session.createQuery("select extract(week of month from current date) from EntityOfBasics e", Integer.class) + .list(); + session.createQuery("select extract(week of year from current date) from EntityOfBasics e", Integer.class) + .list(); + + } + ); + } + @Test public void testExtractFunctionEpoch(SessionFactoryScope scope) { scope.inTransaction( diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/LikeEscapeDefaultTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/LikeEscapeDefaultTest.java index 0e158e81ca74..de7d8b59a913 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/LikeEscapeDefaultTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/LikeEscapeDefaultTest.java @@ -6,6 +6,7 @@ import java.util.List; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.query.Query; import org.hibernate.testing.orm.domain.StandardDomainModel; @@ -14,6 +15,7 @@ import org.hibernate.testing.orm.junit.ServiceRegistry; import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactoryScope; +import org.hibernate.testing.orm.junit.SkipForDialect; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -49,6 +51,8 @@ public void tearDown(SessionFactoryScope scope) { } @Test + @SkipForDialect(dialectClass = InformixDialect.class, + reason = "Informix does not support empty escape ''") public void testDefaultEscapeBackslash(SessionFactoryScope scope) { scope.inTransaction( session -> { Query q = session.createQuery( @@ -62,6 +66,8 @@ public void testDefaultEscapeBackslash(SessionFactoryScope scope) { } @Test + @SkipForDialect(dialectClass = InformixDialect.class, + reason = "Informix does not support empty escape ''") public void testDefaultEscapeBackslashLiteral(SessionFactoryScope scope) { scope.inTransaction( session -> { Query q = session.createQuery( @@ -75,6 +81,8 @@ public void testDefaultEscapeBackslashLiteral(SessionFactoryScope scope) { } @Test + @SkipForDialect(dialectClass = InformixDialect.class, + reason = "Informix does not support empty escape ''") public void testDefaultEscapeNoResults(SessionFactoryScope scope) { scope.inTransaction( session -> { Query q = session.createQuery( diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/SubqueryOperatorsTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/SubqueryOperatorsTest.java index ee95031c458a..f725e96d58b5 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/SubqueryOperatorsTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/SubqueryOperatorsTest.java @@ -7,6 +7,7 @@ import java.util.Calendar; import java.util.List; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.SybaseASEDialect; import org.hibernate.testing.orm.domain.gambit.SimpleEntity; @@ -54,6 +55,7 @@ public void testAny(SessionFactoryScope scope) { @Test @SuppressWarnings("deprecation") @SkipForDialect(dialectClass = SybaseASEDialect.class, reason = "Sybase ASE does not allow a subquery in the order by clause, but we could move it to the select clause and refer to it by position", matchSubTypes = true) + @SkipForDialect(dialectClass = InformixDialect.class, reason = "A syntax error has occurred") public void testSubqueryInVariousClauses(SessionFactoryScope scope) { scope.inTransaction( session -> { @@ -105,8 +107,8 @@ public void setUp(SessionFactoryScope scope) { 1, Calendar.getInstance().getTime(), null, - Integer.MAX_VALUE, - Long.MAX_VALUE, + Integer.MAX_VALUE-1, + Long.MAX_VALUE-1, "aaa" ); session.persist( entity ); @@ -115,8 +117,8 @@ public void setUp(SessionFactoryScope scope) { 2, Calendar.getInstance().getTime(), null, - Integer.MIN_VALUE, - Long.MAX_VALUE, + Integer.MIN_VALUE+1, + Long.MAX_VALUE-1, "zzz" ); session.persist( second_entity ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/CheckConstraintsTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/CheckConstraintsTest.java index 04db51f8e20c..c36b5690c3c4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/CheckConstraintsTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/CheckConstraintsTest.java @@ -56,6 +56,7 @@ public void tearsDown() { } @Test + @RequiresDialectFeature( feature = DialectFeatureChecks.SupportsTableCheck.class) public void testCheckConstraintsAtEntityLevelAreApplied() throws Exception { createSchema( EntityLevelCheck.class ); String fileContent = new String( Files.readAllBytes( output.toPath() ) ).toLowerCase() diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/checkconstraint/table/TableCheckConstraintTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/checkconstraint/table/TableCheckConstraintTest.java index 6aced51a18ae..d2387231ebd6 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/checkconstraint/table/TableCheckConstraintTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/checkconstraint/table/TableCheckConstraintTest.java @@ -31,7 +31,7 @@ @BaseUnitTest @JiraKey("HHH-18054") -@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsColumnCheck.class) +@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsTableCheck.class) public class TableCheckConstraintTest { static final String CONSTRAINTS = "NAME_COLUMN is not null"; static final String SECONDARY_TABLE_CONSTRAINTS = "SECOND_NAME is not null"; @@ -175,8 +175,8 @@ private static boolean tableCreationStatementContainsConstraints( String[] fileContent, String tableName, String secondaryTableConstraints) { - for ( int i = 0; i < fileContent.length; i++ ) { - String statement = fileContent[i].toUpperCase( Locale.ROOT ); + for ( String string : fileContent ) { + String statement = string.toUpperCase( Locale.ROOT ); if ( statement.contains( "CREATE TABLE " + tableName.toUpperCase( Locale.ROOT ) ) ) { if ( statement.contains( secondaryTableConstraints.toUpperCase( Locale.ROOT ) ) ) { return true; @@ -186,10 +186,10 @@ private static boolean tableCreationStatementContainsConstraints( return false; } - private void createSchema(Class... annotatedClasses) { + private void createSchema(Class... annotatedClasses) { final MetadataSources metadataSources = new MetadataSources( ssr ); - for ( Class c : annotatedClasses ) { + for ( Class c : annotatedClasses ) { metadataSources.addAnnotatedClass( c ); } metadata = (MetadataImplementor) metadataSources.buildMetadata(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/foreignkeys/ForeignKeyGenerationTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/foreignkeys/ForeignKeyGenerationTest.java index 5c22d2bf6534..bfe80cb81ff2 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/foreignkeys/ForeignKeyGenerationTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/schemaupdate/foreignkeys/ForeignKeyGenerationTest.java @@ -16,9 +16,11 @@ import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.spi.MetadataImplementor; +import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.env.spi.IdentifierHelper; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; +import org.hibernate.testing.orm.junit.SkipForDialect; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.schema.TargetType; @@ -29,18 +31,18 @@ import org.junit.Before; import org.junit.Test; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.hasItem; -import static org.junit.Assert.assertThat; /** * @author Andrea Boriero */ - +@SkipForDialect(dialectClass = InformixDialect.class, + reason = "Informix has a strange syntax for 'alter table add constraint'") public class ForeignKeyGenerationTest extends BaseUnitTestCase { private File output; private StandardServiceRegistry ssr; - private MetadataImplementor metadata; @Before public void setUp() throws IOException { @@ -150,13 +152,13 @@ alter table EMPLOYEE_PROJECT add constraint FK_PROJECT foreign key (PROJECT_ID) ) ); } - private void createSchema(Class[] annotatedClasses) { + private void createSchema(Class[] annotatedClasses) { final MetadataSources metadataSources = new MetadataSources( ssr ); - for ( Class c : annotatedClasses ) { + for ( Class c : annotatedClasses ) { metadataSources.addAnnotatedClass( c ); } - metadata = (MetadataImplementor) metadataSources.buildMetadata(); + final MetadataImplementor metadata = (MetadataImplementor) metadataSources.buildMetadata(); metadata.orderColumns( false ); metadata.validate(); new SchemaExport() @@ -171,7 +173,8 @@ private void checkAlterTableStatement(AlterTableStatement alterTableStatement) final String expectedAlterTableStatement = alterTableStatement.toSQL(); final List sqlLines = Files.readAllLines( output.toPath(), Charset.defaultCharset() ); - assertThat( "Expected alter table statement not found", sqlLines, hasItem( containsString( expectedAlterTableStatement ) ) ); + assertThat( "Expected alter table statement not found", sqlLines, + hasItem( containsString( expectedAlterTableStatement ) ) ); } private static class AlterTableStatement { @@ -195,7 +198,7 @@ public AlterTableStatement( } public String toSQL() { - JdbcEnvironment jdbcEnvironment = ssr.getService( JdbcEnvironment.class ); + JdbcEnvironment jdbcEnvironment = ssr.requireService( JdbcEnvironment.class ); Dialect dialect = jdbcEnvironment.getDialect(); IdentifierHelper identifierHelper = jdbcEnvironment.getIdentifierHelper(); UnaryOperator asIdentifier = identifier -> identifierHelper.toIdentifier( identifier ).render( dialect ); 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 b27b78efe6d3..922cdde97766 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 @@ -158,6 +158,12 @@ public boolean apply(Dialect dialect) { } } + public static class SupportsTableCheck implements DialectFeatureCheck { + public boolean apply(Dialect dialect) { + return dialect.supportsTableCheck(); + } + } + public static class SupportsNoColumnInsert implements DialectFeatureCheck { public boolean apply(Dialect dialect) { return dialect.supportsNoColumnsInsert(); diff --git a/settings.gradle b/settings.gradle index b399894f40c8..a093be7f163c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -224,7 +224,7 @@ dependencyResolutionManagement { def hanaVersion = version "hana", "2.22.12" def h2gisVersion = version "h2gis", overrideableVersion( "gradle.libs.versions.h2gis", "2.2.3" ) def hsqldbVersion = version "hsqldb", overrideableVersion( "gradle.libs.versions.hsqldb", "2.7.4" ) - def informixVersion = version "informix", "4.50.11" + def informixVersion = version "informix", "15.0.0.1.1" def mariadbVersion = version "mariadb", "3.5.1" def mssqlVersion = version "mssql", "12.8.1.jre11" def mysqlVersion = version "mysql", "9.2.0"