Skip to content

Commit b9aa32c

Browse files
committed
add a cast around string functions with parameter args on Informix
1 parent 12d216c commit b9aa32c

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.hibernate.engine.spi.SessionFactoryImplementor;
1010
import org.hibernate.query.IllegalQueryOperationException;
1111
import org.hibernate.query.sqm.ComparisonOperator;
12+
import org.hibernate.query.sqm.sql.internal.SqmParameterInterpretation;
1213
import org.hibernate.sql.ast.Clause;
1314
import org.hibernate.sql.ast.spi.SqlAstTranslatorWithMerge;
1415
import org.hibernate.sql.ast.spi.SqlSelection;
@@ -18,6 +19,7 @@
1819
import org.hibernate.sql.ast.tree.expression.Expression;
1920
import org.hibernate.sql.ast.tree.expression.FunctionExpression;
2021
import org.hibernate.sql.ast.tree.expression.Literal;
22+
import org.hibernate.sql.ast.tree.expression.SelfRenderingExpression;
2123
import org.hibernate.sql.ast.tree.expression.SqlTuple;
2224
import org.hibernate.sql.ast.tree.expression.Summarization;
2325
import org.hibernate.sql.ast.tree.from.ValuesTableReference;
@@ -244,6 +246,23 @@ public void visitQuerySpec(QuerySpec querySpec) {
244246
}
245247
}
246248

249+
@Override
250+
public void visitSelfRenderingExpression(SelfRenderingExpression expression) {
251+
final boolean isStringFunctionWithParameterArg =
252+
expression instanceof FunctionExpression fn
253+
&& expression.getExpressionType() != null
254+
&& expression.getExpressionType().getJdbcTypeCount() == 1
255+
&& expression.getExpressionType().getSingleJdbcMapping().getJdbcType().isString()
256+
&& fn.getArguments().stream().anyMatch( arg -> arg instanceof SqmParameterInterpretation );
257+
if ( isStringFunctionWithParameterArg ) {
258+
append( "cast(" );
259+
}
260+
super.visitSelfRenderingExpression( expression );
261+
if ( isStringFunctionWithParameterArg ) {
262+
append( " as lvarchar)" );
263+
}
264+
}
265+
247266
private void caseArgument(Expression expression) {
248267
// concatenation inside a case must be cast to varchar(255)
249268
// or we get a bunch of trailing whitespace

0 commit comments

Comments
 (0)