Skip to content

Commit fed820b

Browse files
committed
get more FunctionTests working on Informix
apparently we do need to use getDual() when there is a 'where' clause but no 'from' clause
1 parent 61e1623 commit fed820b

File tree

4 files changed

+54
-16
lines changed

4 files changed

+54
-16
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,9 @@ public String castPattern(CastType from, CastType to) {
737737
return "case ?1 when 't' then 1 when 'f' then 0 else null end";
738738
}
739739
}
740+
if ( from == CastType.STRING && to == CastType.BOOLEAN ) {
741+
return buildStringToBooleanCast( "'t'", "'f'" );
742+
}
740743
return super.castPattern( from, to );
741744
}
742745

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,22 @@ public InformixSqlAstTranslator(SessionFactoryImplementor sessionFactory, Statem
4141
super( sessionFactory, statement );
4242
}
4343

44+
@Override
45+
protected void visitQueryClauses(QuerySpec querySpec) {
46+
visitSelectClause( querySpec.getSelectClause() );
47+
visitFromClause( querySpec.getFromClause() );
48+
if ( !hasFrom( querySpec.getFromClause() )
49+
&& hasWhere( querySpec.getWhereClauseRestrictions() ) ) {
50+
append( " from " );
51+
append( getDual() );
52+
}
53+
visitWhereClause( querySpec.getWhereClauseRestrictions() );
54+
visitGroupByClause( querySpec, getDialect().getGroupBySelectItemReferenceStrategy() );
55+
visitHavingClause( querySpec );
56+
visitOrderBy( querySpec.getSortSpecifications() );
57+
visitOffsetFetchClause( querySpec );
58+
}
59+
4460
@Override
4561
public void visitSelectClause(SelectClause selectClause) {
4662
getClauseStack().push( Clause.SELECT );

hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3623,13 +3623,8 @@ else if ( !dialect.supportsDuplicateSelectItemsInQueryGroup() ) {
36233623
if ( queryGroupAlias != null ) {
36243624
appendSql( OPEN_PARENTHESIS );
36253625
}
3626-
visitSelectClause( querySpec.getSelectClause() );
3627-
visitFromClause( querySpec.getFromClause() );
3628-
visitWhereClause( querySpec.getWhereClauseRestrictions() );
3629-
visitGroupByClause( querySpec, dialect.getGroupBySelectItemReferenceStrategy() );
3630-
visitHavingClause( querySpec );
3631-
visitOrderBy( querySpec.getSortSpecifications() );
3632-
visitOffsetFetchClause( querySpec );
3626+
3627+
visitQueryClauses( querySpec );
36333628
// We render the FOR UPDATE clause in the parent query
36343629
if ( queryPartForRowNumbering == null ) {
36353630
visitForUpdateClause( querySpec );
@@ -3652,6 +3647,16 @@ else if ( !dialect.supportsDuplicateSelectItemsInQueryGroup() ) {
36523647
}
36533648
}
36543649

3650+
protected void visitQueryClauses(QuerySpec querySpec) {
3651+
visitSelectClause( querySpec.getSelectClause() );
3652+
visitFromClause( querySpec.getFromClause() );
3653+
visitWhereClause( querySpec.getWhereClauseRestrictions() );
3654+
visitGroupByClause( querySpec, dialect.getGroupBySelectItemReferenceStrategy() );
3655+
visitHavingClause( querySpec );
3656+
visitOrderBy( querySpec.getSortSpecifications() );
3657+
visitOffsetFetchClause( querySpec );
3658+
}
3659+
36553660
private boolean hasDuplicateSelectItems(QuerySpec querySpec) {
36563661
final List<SqlSelection> sqlSelections = querySpec.getSelectClause().getSqlSelections();
36573662
final Map<Expression, Boolean> map = new IdentityHashMap<>( sqlSelections.size() );
@@ -3664,9 +3669,8 @@ private boolean hasDuplicateSelectItems(QuerySpec querySpec) {
36643669
}
36653670

36663671
protected final void visitWhereClause(Predicate whereClauseRestrictions) {
3667-
final Predicate additionalWherePredicate = this.additionalWherePredicate;
3668-
if ( whereClauseRestrictions != null && !whereClauseRestrictions.isEmpty()
3669-
|| additionalWherePredicate != null ) {
3672+
if ( hasWhere( whereClauseRestrictions ) ) {
3673+
final Predicate additionalWherePredicate = this.additionalWherePredicate;
36703674
appendSql( " where " );
36713675

36723676
clauseStack.push( Clause.WHERE );
@@ -3690,6 +3694,11 @@ else if ( additionalWherePredicate != null ) {
36903694
}
36913695
}
36923696

3697+
protected boolean hasWhere(Predicate whereClauseRestrictions) {
3698+
return whereClauseRestrictions != null && !whereClauseRestrictions.isEmpty()
3699+
|| additionalWherePredicate != null;
3700+
}
3701+
36933702
protected Expression resolveAliasedExpression(Expression expression) {
36943703
// This can happen when using window functions for emulating the offset/fetch clause of a query group
36953704
// But in that case we always use a SqlSelectionExpression anyway, so this is fine as it doesn't need resolving
@@ -5682,8 +5691,9 @@ protected void renderLiteral(Literal literal, boolean castParameter) {
56825691
// If we encounter a plain literal in the select clause which has no literal formatter, we must render it as parameter
56835692
if ( literalFormatter == null ) {
56845693
parameterBinders.add( literal );
5685-
final String marker = parameterMarkerStrategy.createMarker( parameterBinders.size(), literal.getJdbcMapping().getJdbcType() );
5686-
final LiteralAsParameter<Object> jdbcParameter = new LiteralAsParameter<>( literal, marker );
5694+
final JdbcType jdbcType = literal.getJdbcMapping().getJdbcType();
5695+
final String marker = parameterMarkerStrategy.createMarker( parameterBinders.size(), jdbcType );
5696+
final LiteralAsParameter<?> jdbcParameter = new LiteralAsParameter<>( literal, marker );
56875697
if ( castParameter ) {
56885698
renderCasted( jdbcParameter );
56895699
}
@@ -5707,13 +5717,17 @@ protected void renderLiteral(Literal literal, boolean castParameter) {
57075717

57085718
@Override
57095719
public void visitFromClause(FromClause fromClause) {
5710-
if ( fromClause == null || fromClause.getRoots().isEmpty() ) {
5711-
appendSql( getFromDualForSelectOnly() );
5712-
}
5713-
else {
5720+
if ( hasFrom( fromClause ) ) {
57145721
appendSql( " from " );
57155722
renderFromClauseSpaces( fromClause );
57165723
}
5724+
else {
5725+
appendSql( getFromDualForSelectOnly() );
5726+
}
5727+
}
5728+
5729+
protected boolean hasFrom(FromClause fromClause) {
5730+
return fromClause != null && !fromClause.getRoots().isEmpty();
57175731
}
57185732

57195733
protected void renderFromClauseSpaces(FromClause fromClause) {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,6 +1176,7 @@ public void testCastFunctionWithLength(SessionFactoryScope scope) {
11761176
@SkipForDialect(dialectClass = OracleDialect.class, reason = "Oracle cast to raw does not do truncation")
11771177
@SkipForDialect(dialectClass = DB2Dialect.class, majorVersion = 10, minorVersion = 5, reason = "On this version the length of the cast to the parameter appears to be > 2")
11781178
@SkipForDialect(dialectClass = HSQLDialect.class, reason = "HSQL interprets string as hex literal and produces error")
1179+
@SkipForDialect(dialectClass = InformixDialect.class, reason = "No cast from varchar to byte")
11791180
public void testCastBinaryWithLength(SessionFactoryScope scope) {
11801181
scope.inTransaction(
11811182
session -> {
@@ -1190,6 +1191,7 @@ public void testCastBinaryWithLength(SessionFactoryScope scope) {
11901191

11911192
@Test
11921193
@SkipForDialect(dialectClass = DerbyDialect.class, reason = "Derby doesn't support casting varchar to binary")
1194+
@SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix does not support binary literals")
11931195
public void testCastBinaryWithLengthForOracle(SessionFactoryScope scope) {
11941196
scope.inTransaction(
11951197
session -> {
@@ -1202,6 +1204,7 @@ public void testCastBinaryWithLengthForOracle(SessionFactoryScope scope) {
12021204

12031205
@Test
12041206
@SkipForDialect(dialectClass = PostgreSQLDialect.class, matchSubTypes = true, reason = "PostgreSQL bytea doesn't have a length")
1207+
@SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix does not support binary literals")
12051208
public void testCastBinaryWithLengthForDerby(SessionFactoryScope scope) {
12061209
scope.inTransaction(
12071210
session -> {
@@ -2587,6 +2590,7 @@ public void testSlice(SessionFactoryScope scope) {
25872590
@SkipForDialect(dialectClass = DerbyDialect.class)
25882591
@SkipForDialect(dialectClass = HSQLDialect.class)
25892592
@SkipForDialect(dialectClass = DB2Dialect.class)
2593+
@SkipForDialect(dialectClass = InformixDialect.class)
25902594
public void testNullInCoalesce(SessionFactoryScope scope) {
25912595
scope.inTransaction(s -> {
25922596
assertEquals("hello",
@@ -2665,6 +2669,7 @@ public void testSha256Function(SessionFactoryScope scope) {
26652669

26662670
@Test
26672671
@SkipForDialect(dialectClass = SybaseASEDialect.class)
2672+
@SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix does not support binary literals")
26682673
public void testHexFunction(SessionFactoryScope scope) {
26692674
scope.inTransaction(s -> {
26702675
assertEquals( "DEADBEEF",

0 commit comments

Comments
 (0)