From 1cc94c76b9ede65001923b9611208996222a1ad3 Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Wed, 14 Jun 2023 18:09:17 +0200 Subject: [PATCH] HHH-16589 Limit in clause padding to Dialect.getInExpressionCountLimit and fix negated in predicate splitting --- .../sql/ast/spi/AbstractSqlAstTranslator.java | 40 ++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java index bf80bceb4a..daf450a596 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java @@ -6839,13 +6839,6 @@ public abstract class AbstractSqlAstTranslator implemen } } - inListPredicate.getTestExpression().accept( this ); - if ( inListPredicate.isNegated() ) { - appendSql( " not" ); - } - appendSql( " in (" ); - String separator = NO_SEPARATOR; - int bindValueCount = listExpressions.size(); int bindValueMaxCount = bindValueCount; @@ -6881,6 +6874,19 @@ public abstract class AbstractSqlAstTranslator implemen } } + final boolean parenthesis = !inListPredicate.isNegated() + && inExprLimit != 0 && listExpressions.size() > inExprLimit; + if ( parenthesis ) { + appendSql( OPEN_PARENTHESIS ); + } + + inListPredicate.getTestExpression().accept( this ); + if ( inListPredicate.isNegated() ) { + appendSql( " not" ); + } + appendSql( " in (" ); + String separator = NO_SEPARATOR; + final Iterator iterator = listExpressions.iterator(); int itemNumber = 0; while ( iterator.hasNext() && ( inExprLimit == 0 || itemNumber < inExprLimit ) ) { @@ -6904,11 +6910,15 @@ public abstract class AbstractSqlAstTranslator implemen if ( inExprLimit > 0 && bindValueCount > inExprLimit ) { do { - append( ") or " ); - inListPredicate.getTestExpression().accept( this ); if ( inListPredicate.isNegated() ) { + append( ") and " ); + inListPredicate.getTestExpression().accept( this ); appendSql( " not" ); } + else { + append( ") or " ); + inListPredicate.getTestExpression().accept( this ); + } appendSql( " in (" ); separator = NO_SEPARATOR; itemNumber = 0; @@ -6924,13 +6934,23 @@ public abstract class AbstractSqlAstTranslator implemen if ( inClauseParameterPaddingEnabled ) { final Expression lastExpression = itemAccessor.apply( listExpressions.get( listExpressions.size() - 1 ) ); - for ( ; itemNumber < bindValueMaxCount; itemNumber++ ) { + final int end; + if ( inExprLimit > 0 ) { + end = Math.min( bindValueMaxCount, inExprLimit ); + } + else { + end = bindValueMaxCount; + } + for ( ; itemNumber < end; itemNumber++ ) { appendSql( separator ); lastExpression.accept( this ); separator = COMMA_SEPARATOR; } } appendSql( CLOSE_PARENTHESIS ); + if ( parenthesis ) { + appendSql( CLOSE_PARENTHESIS ); + } } @Override