[#5601] IN list padding setting should also apply to row IN predicates

This commit is contained in:
lukaseder 2018-10-10 16:11:30 +02:00
parent ab42758592
commit 816ca6b5a8
2 changed files with 7 additions and 8 deletions

View File

@ -161,9 +161,9 @@ final class InCondition<T> extends AbstractCondition {
}
}
private static List<Field<?>> padded(Context<?> ctx, List<Field<?>> list) {
static <T> List<T> padded(Context<?> ctx, List<T> list) {
return ctx.paramType() == INDEXED && TRUE.equals(ctx.settings().isInListPadding())
? new PaddedList<Field<?>>(list, REQUIRES_IN_LIMIT.contains(ctx.family())
? new PaddedList<T>(list, REQUIRES_IN_LIMIT.contains(ctx.family())
? IN_LIMIT
: Integer.MAX_VALUE,
defaultIfNull(ctx.settings().getInListPadBase(), 2))
@ -179,10 +179,9 @@ final class InCondition<T> extends AbstractCondition {
.visit(comparator.toKeyword())
.sql(" (");
if (subValues.size() > 1) {
if (subValues.size() > 1)
ctx.formatIndentStart()
.formatNewLine();
}
String separator = "";
for (Field<?> value : subValues) {
@ -193,15 +192,14 @@ final class InCondition<T> extends AbstractCondition {
separator = ", ";
}
if (subValues.size() > 1) {
if (subValues.size() > 1)
ctx.formatIndentEnd()
.formatNewLine();
}
ctx.sql(')');
}
private static class PaddedList<T> extends AbstractList<T> {
static class PaddedList<T> extends AbstractList<T> {
private final List<T> delegate;
private final int realSize;
private final int padSize;

View File

@ -57,6 +57,7 @@ import static org.jooq.SQLDialect.SQLITE;
// ...
import static org.jooq.impl.DSL.falseCondition;
import static org.jooq.impl.DSL.trueCondition;
import static org.jooq.impl.InCondition.padded;
import java.util.ArrayList;
import java.util.EnumSet;
@ -145,7 +146,7 @@ final class RowInCondition extends AbstractCondition {
.sql(' ')
.visit(comparator.toKeyword())
.sql(" (")
.visit(right)
.visit(new QueryPartList<Row>(padded(ctx, right)))
.sql(')');
}
}