| 
9 | 9 | import org.hibernate.engine.spi.SessionFactoryImplementor;  | 
10 | 10 | import org.hibernate.query.IllegalQueryOperationException;  | 
11 | 11 | import org.hibernate.query.sqm.ComparisonOperator;  | 
 | 12 | +import org.hibernate.query.sqm.sql.internal.SqmParameterInterpretation;  | 
12 | 13 | import org.hibernate.sql.ast.Clause;  | 
13 | 14 | import org.hibernate.sql.ast.spi.SqlAstTranslatorWithMerge;  | 
14 | 15 | import org.hibernate.sql.ast.spi.SqlSelection;  | 
 | 
18 | 19 | import org.hibernate.sql.ast.tree.expression.Expression;  | 
19 | 20 | import org.hibernate.sql.ast.tree.expression.FunctionExpression;  | 
20 | 21 | import org.hibernate.sql.ast.tree.expression.Literal;  | 
 | 22 | +import org.hibernate.sql.ast.tree.expression.SelfRenderingExpression;  | 
21 | 23 | import org.hibernate.sql.ast.tree.expression.SqlTuple;  | 
22 | 24 | import org.hibernate.sql.ast.tree.expression.Summarization;  | 
23 | 25 | import org.hibernate.sql.ast.tree.from.ValuesTableReference;  | 
@@ -244,6 +246,23 @@ public void visitQuerySpec(QuerySpec querySpec) {  | 
244 | 246 | 		}  | 
245 | 247 | 	}  | 
246 | 248 | 
 
  | 
 | 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 | + | 
247 | 266 | 	private void caseArgument(Expression expression) {  | 
248 | 267 | 		// concatenation inside a case must be cast to varchar(255)  | 
249 | 268 | 		// or we get a bunch of trailing whitespace  | 
 | 
0 commit comments