Skip to content

Commit 3b49683

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 480d6f5 commit 3b49683

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
@@ -3631,13 +3631,8 @@ else if ( !dialect.supportsDuplicateSelectItemsInQueryGroup() ) {
36313631
if ( queryGroupAlias != null ) {
36323632
appendSql( OPEN_PARENTHESIS );
36333633
}
3634-
visitSelectClause( querySpec.getSelectClause() );
3635-
visitFromClause( querySpec.getFromClause() );
3636-
visitWhereClause( querySpec.getWhereClauseRestrictions() );
3637-
visitGroupByClause( querySpec, dialect.getGroupBySelectItemReferenceStrategy() );
3638-
visitHavingClause( querySpec );
3639-
visitOrderBy( querySpec.getSortSpecifications() );
3640-
visitOffsetFetchClause( querySpec );
3634+
3635+
visitQueryClauses( querySpec );
36413636
// We render the FOR UPDATE clause in the parent query
36423637
if ( queryPartForRowNumbering == null ) {
36433638
visitForUpdateClause( querySpec );
@@ -3660,6 +3655,16 @@ else if ( !dialect.supportsDuplicateSelectItemsInQueryGroup() ) {
36603655
}
36613656
}
36623657

3658+
protected void visitQueryClauses(QuerySpec querySpec) {
3659+
visitSelectClause( querySpec.getSelectClause() );
3660+
visitFromClause( querySpec.getFromClause() );
3661+
visitWhereClause( querySpec.getWhereClauseRestrictions() );
3662+
visitGroupByClause( querySpec, dialect.getGroupBySelectItemReferenceStrategy() );
3663+
visitHavingClause( querySpec );
3664+
visitOrderBy( querySpec.getSortSpecifications() );
3665+
visitOffsetFetchClause( querySpec );
3666+
}
3667+
36633668
private boolean hasDuplicateSelectItems(QuerySpec querySpec) {
36643669
final List<SqlSelection> sqlSelections = querySpec.getSelectClause().getSqlSelections();
36653670
final Map<Expression, Boolean> map = new IdentityHashMap<>( sqlSelections.size() );
@@ -3672,9 +3677,8 @@ private boolean hasDuplicateSelectItems(QuerySpec querySpec) {
36723677
}
36733678

36743679
protected final void visitWhereClause(Predicate whereClauseRestrictions) {
3675-
final Predicate additionalWherePredicate = this.additionalWherePredicate;
3676-
if ( whereClauseRestrictions != null && !whereClauseRestrictions.isEmpty()
3677-
|| additionalWherePredicate != null ) {
3680+
if ( hasWhere( whereClauseRestrictions ) ) {
3681+
final Predicate additionalWherePredicate = this.additionalWherePredicate;
36783682
appendSql( " where " );
36793683

36803684
clauseStack.push( Clause.WHERE );
@@ -3698,6 +3702,11 @@ else if ( additionalWherePredicate != null ) {
36983702
}
36993703
}
37003704

3705+
protected boolean hasWhere(Predicate whereClauseRestrictions) {
3706+
return whereClauseRestrictions != null && !whereClauseRestrictions.isEmpty()
3707+
|| additionalWherePredicate != null;
3708+
}
3709+
37013710
protected Expression resolveAliasedExpression(Expression expression) {
37023711
// This can happen when using window functions for emulating the offset/fetch clause of a query group
37033712
// But in that case we always use a SqlSelectionExpression anyway, so this is fine as it doesn't need resolving
@@ -5690,8 +5699,9 @@ protected void renderLiteral(Literal literal, boolean castParameter) {
56905699
// If we encounter a plain literal in the select clause which has no literal formatter, we must render it as parameter
56915700
if ( literalFormatter == null ) {
56925701
parameterBinders.add( literal );
5693-
final String marker = parameterMarkerStrategy.createMarker( parameterBinders.size(), literal.getJdbcMapping().getJdbcType() );
5694-
final LiteralAsParameter<Object> jdbcParameter = new LiteralAsParameter<>( literal, marker );
5702+
final JdbcType jdbcType = literal.getJdbcMapping().getJdbcType();
5703+
final String marker = parameterMarkerStrategy.createMarker( parameterBinders.size(), jdbcType );
5704+
final LiteralAsParameter<?> jdbcParameter = new LiteralAsParameter<>( literal, marker );
56955705
if ( castParameter ) {
56965706
renderCasted( jdbcParameter );
56975707
}
@@ -5715,13 +5725,17 @@ protected void renderLiteral(Literal literal, boolean castParameter) {
57155725

57165726
@Override
57175727
public void visitFromClause(FromClause fromClause) {
5718-
if ( fromClause == null || fromClause.getRoots().isEmpty() ) {
5719-
appendSql( getFromDualForSelectOnly() );
5720-
}
5721-
else {
5728+
if ( hasFrom( fromClause ) ) {
57225729
appendSql( " from " );
57235730
renderFromClauseSpaces( fromClause );
57245731
}
5732+
else {
5733+
appendSql( getFromDualForSelectOnly() );
5734+
}
5735+
}
5736+
5737+
protected boolean hasFrom(FromClause fromClause) {
5738+
return fromClause != null && !fromClause.getRoots().isEmpty();
57255739
}
57265740

57275741
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)