HHH-18359 Add a wrap parameter rendering mode for Informix

This commit is contained in:
Christian Beikov 2024-07-16 18:00:42 +02:00
parent c6e8df8c5d
commit 823012b29c
2 changed files with 32 additions and 7 deletions

View File

@ -54,5 +54,12 @@ public enum SqlAstNodeRenderingMode {
* such that it doesn't appear as plain parameter. * such that it doesn't appear as plain parameter.
* <code>null</code> literals will be wrapped in a cast. * <code>null</code> literals will be wrapped in a cast.
*/ */
NO_UNTYPED NO_UNTYPED,
/**
* Wrap all nested parameters with a database specific wrapping strategy,
* defaulting to wrapping via a subquery e.g. {@code (select ?)}.
* This is useful for certain databases that don't support parameters directly within certain functions, like Informix.
*/
WRAP_ALL_PARAMETERS
} }

View File

@ -7053,6 +7053,9 @@ public abstract class AbstractSqlAstTranslator<T extends JdbcOperation> implemen
renderExpressionAsLiteral( jdbcParameter, jdbcParameterBindings ); renderExpressionAsLiteral( jdbcParameter, jdbcParameterBindings );
break; break;
} }
case WRAP_ALL_PARAMETERS:
renderWrappedParameter( jdbcParameter );
break;
case DEFAULT: case DEFAULT:
default: { default: {
visitParameterAsParameter( jdbcParameter ); visitParameterAsParameter( jdbcParameter );
@ -7073,6 +7076,21 @@ public abstract class AbstractSqlAstTranslator<T extends JdbcOperation> implemen
renderParameterAsParameter( parameterBinders.size() + 1, jdbcParameter ); renderParameterAsParameter( parameterBinders.size() + 1, jdbcParameter );
} }
protected void renderWrappedParameter(JdbcParameter jdbcParameter) {
clauseStack.push( Clause.SELECT );
try {
appendSql( "(select " );
render( jdbcParameter, SqlAstNodeRenderingMode.DEFAULT );
appendSql( getFromDualForSelectOnly() );
appendSql( ')' );
}
finally {
clauseStack.pop();
}
}
/** /**
* Renders a parameter marker for the given position * Renders a parameter marker for the given position
* @param jdbcParameter * @param jdbcParameter
@ -7088,7 +7106,7 @@ public abstract class AbstractSqlAstTranslator<T extends JdbcOperation> implemen
@Override @Override
public void render(SqlAstNode sqlAstNode, SqlAstNodeRenderingMode renderingMode) { public void render(SqlAstNode sqlAstNode, SqlAstNodeRenderingMode renderingMode) {
SqlAstNodeRenderingMode original = this.parameterRenderingMode; SqlAstNodeRenderingMode original = this.parameterRenderingMode;
if ( original != SqlAstNodeRenderingMode.INLINE_ALL_PARAMETERS ) { if ( original != SqlAstNodeRenderingMode.INLINE_ALL_PARAMETERS && original != SqlAstNodeRenderingMode.WRAP_ALL_PARAMETERS ) {
this.parameterRenderingMode = renderingMode; this.parameterRenderingMode = renderingMode;
} }
try { try {
@ -7101,7 +7119,7 @@ public abstract class AbstractSqlAstTranslator<T extends JdbcOperation> implemen
protected void withParameterRenderingMode(SqlAstNodeRenderingMode renderingMode, Runnable runnable) { protected void withParameterRenderingMode(SqlAstNodeRenderingMode renderingMode, Runnable runnable) {
SqlAstNodeRenderingMode original = this.parameterRenderingMode; SqlAstNodeRenderingMode original = this.parameterRenderingMode;
if ( original != SqlAstNodeRenderingMode.INLINE_ALL_PARAMETERS ) { if ( original != SqlAstNodeRenderingMode.INLINE_ALL_PARAMETERS && original != SqlAstNodeRenderingMode.WRAP_ALL_PARAMETERS ) {
this.parameterRenderingMode = renderingMode; this.parameterRenderingMode = renderingMode;
} }
try { try {
@ -7285,7 +7303,7 @@ public abstract class AbstractSqlAstTranslator<T extends JdbcOperation> implemen
appendSql( "case" ); appendSql( "case" );
final SqlAstNodeRenderingMode original = this.parameterRenderingMode; final SqlAstNodeRenderingMode original = this.parameterRenderingMode;
for ( CaseSearchedExpression.WhenFragment whenFragment : caseSearchedExpression.getWhenFragments() ) { for ( CaseSearchedExpression.WhenFragment whenFragment : caseSearchedExpression.getWhenFragments() ) {
if ( original != SqlAstNodeRenderingMode.INLINE_ALL_PARAMETERS ) { if ( original != SqlAstNodeRenderingMode.INLINE_ALL_PARAMETERS && original != SqlAstNodeRenderingMode.WRAP_ALL_PARAMETERS ) {
this.parameterRenderingMode = SqlAstNodeRenderingMode.DEFAULT; this.parameterRenderingMode = SqlAstNodeRenderingMode.DEFAULT;
} }
appendSql( " when " ); appendSql( " when " );
@ -7313,7 +7331,7 @@ public abstract class AbstractSqlAstTranslator<T extends JdbcOperation> implemen
for ( int i = 0; i < caseNumber; i++ ) { for ( int i = 0; i < caseNumber; i++ ) {
final CaseSearchedExpression.WhenFragment whenFragment = whenFragments.get( i ); final CaseSearchedExpression.WhenFragment whenFragment = whenFragments.get( i );
Predicate predicate = whenFragment.getPredicate(); Predicate predicate = whenFragment.getPredicate();
if ( original != SqlAstNodeRenderingMode.INLINE_ALL_PARAMETERS ) { if ( original != SqlAstNodeRenderingMode.INLINE_ALL_PARAMETERS && original != SqlAstNodeRenderingMode.WRAP_ALL_PARAMETERS ) {
this.parameterRenderingMode = SqlAstNodeRenderingMode.DEFAULT; this.parameterRenderingMode = SqlAstNodeRenderingMode.DEFAULT;
} }
if ( i != 0 ) { if ( i != 0 ) {
@ -7360,12 +7378,12 @@ public abstract class AbstractSqlAstTranslator<T extends JdbcOperation> implemen
Consumer<Expression> resultRenderer) { Consumer<Expression> resultRenderer) {
appendSql( "case " ); appendSql( "case " );
final SqlAstNodeRenderingMode original = this.parameterRenderingMode; final SqlAstNodeRenderingMode original = this.parameterRenderingMode;
if ( original != SqlAstNodeRenderingMode.INLINE_ALL_PARAMETERS ) { if ( original != SqlAstNodeRenderingMode.INLINE_ALL_PARAMETERS && original != SqlAstNodeRenderingMode.WRAP_ALL_PARAMETERS ) {
this.parameterRenderingMode = SqlAstNodeRenderingMode.DEFAULT; this.parameterRenderingMode = SqlAstNodeRenderingMode.DEFAULT;
} }
caseSimpleExpression.getFixture().accept( this ); caseSimpleExpression.getFixture().accept( this );
for ( CaseSimpleExpression.WhenFragment whenFragment : caseSimpleExpression.getWhenFragments() ) { for ( CaseSimpleExpression.WhenFragment whenFragment : caseSimpleExpression.getWhenFragments() ) {
if ( original != SqlAstNodeRenderingMode.INLINE_ALL_PARAMETERS ) { if ( original != SqlAstNodeRenderingMode.INLINE_ALL_PARAMETERS && original != SqlAstNodeRenderingMode.WRAP_ALL_PARAMETERS ) {
this.parameterRenderingMode = SqlAstNodeRenderingMode.DEFAULT; this.parameterRenderingMode = SqlAstNodeRenderingMode.DEFAULT;
} }
appendSql( " when " ); appendSql( " when " );