diff --git a/mondrian/src/main/java/mondrian/calc/impl/ArrayTupleList.java b/mondrian/src/main/java/mondrian/calc/impl/ArrayTupleList.java index f5d820530e..9f31628645 100644 --- a/mondrian/src/main/java/mondrian/calc/impl/ArrayTupleList.java +++ b/mondrian/src/main/java/mondrian/calc/impl/ArrayTupleList.java @@ -11,6 +11,7 @@ import mondrian.calc.*; import mondrian.olap.*; +import mondrian.resource.MondrianResource; import java.util.*; @@ -24,6 +25,7 @@ public class ArrayTupleList extends AbstractEndToEndTupleList { private transient Member[] objectData; private int size; + private static final int cjMaxSize = MondrianProperties.instance().ResultLimit.get(); /** * Creates an empty ArrayTupleList with an initial capacity of 10 tuples. @@ -247,6 +249,11 @@ private void ensureCapacity(int minCapacity) { // Up to next multiple of arity. final int rem = newCapacity % arity; newCapacity += (arity - rem); + if (cjMaxSize > 0 && newCapacity > cjMaxSize) { + throw MondrianResource.instance().TotalMembersLimitExceeded.ex( + newCapacity, cjMaxSize); + } + Util.checkCJResultLimit(newCapacity); objectData = Util.copyOf(objectData, newCapacity); } } diff --git a/mondrian/src/main/java/mondrian/olap/fun/CrossJoinFunDef.java b/mondrian/src/main/java/mondrian/olap/fun/CrossJoinFunDef.java index 5968d0d52e..1a0d0b7c8e 100644 --- a/mondrian/src/main/java/mondrian/olap/fun/CrossJoinFunDef.java +++ b/mondrian/src/main/java/mondrian/olap/fun/CrossJoinFunDef.java @@ -365,7 +365,13 @@ public TupleList evaluateList(Evaluator evaluator) { ListCalc listCalc2 = (ListCalc) calcs[1]; TupleList l1 = listCalc1.evaluateList(evaluator); + // check if size of first list already exceeds limit + Util.checkCJResultLimit(l1.size()); TupleList l2 = listCalc2.evaluateList(evaluator); + // check if size of second list already exceeds limit + Util.checkCJResultLimit(l2.size()); + // check crossjoin + Util.checkCJResultLimit(l1.size() * l2.size()); l1 = nonEmptyOptimizeList(evaluator, l1, call); if (l1.isEmpty()) { diff --git a/mondrian/src/main/java/mondrian/rolap/RolapNativeSet.java b/mondrian/src/main/java/mondrian/rolap/RolapNativeSet.java index abfcdb26e4..10e3fc4472 100644 --- a/mondrian/src/main/java/mondrian/rolap/RolapNativeSet.java +++ b/mondrian/src/main/java/mondrian/rolap/RolapNativeSet.java @@ -267,6 +267,9 @@ protected TupleList executeList(final SqlTupleReader tr) { dataSource, partialResult, newPartialResult); } + // Check limit of result size already is too large + Util.checkCJResultLimit(result.size()); + // Did not get as many members as expected - try to complete using // less constraints if (completeWithNullValues && result.size() < maxRows) {