diff --git a/core/src/main/java/org/opensearch/sql/planner/physical/LimitOperator.java b/core/src/main/java/org/opensearch/sql/planner/physical/LimitOperator.java index dc9038f2a3e..3cb66cdc056 100644 --- a/core/src/main/java/org/opensearch/sql/planner/physical/LimitOperator.java +++ b/core/src/main/java/org/opensearch/sql/planner/physical/LimitOperator.java @@ -39,7 +39,7 @@ public void open() { super.open(); // skip the leading rows of offset size - while (input.hasNext() && count < offset) { + while (count < offset && input.hasNext()) { count++; input.next(); } diff --git a/core/src/test/java/org/opensearch/sql/planner/physical/LimitOperatorTest.java b/core/src/test/java/org/opensearch/sql/planner/physical/LimitOperatorTest.java index fa3788cc2d2..832a30a6fa8 100644 --- a/core/src/test/java/org/opensearch/sql/planner/physical/LimitOperatorTest.java +++ b/core/src/test/java/org/opensearch/sql/planner/physical/LimitOperatorTest.java @@ -8,12 +8,14 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.opensearch.sql.data.type.ExprCoreType.INTEGER; import com.google.common.collect.ImmutableMap; import java.util.List; import org.junit.jupiter.api.Test; import org.opensearch.sql.data.model.ExprValue; import org.opensearch.sql.data.model.ExprValueUtils; +import org.opensearch.sql.expression.DSL; public class LimitOperatorTest extends PhysicalPlanTestBase { @@ -63,4 +65,15 @@ public void offset_exceeds_row_number() { List result = execute(plan); assertEquals(0, result.size()); } + + @Test + public void zero_offset_limit_does_not_skip_first_deduplicated_row() { + PhysicalPlan dedupe = new DedupeOperator(new TestScan(), List.of(DSL.ref("response", INTEGER))); + PhysicalPlan plan = new LimitOperator(dedupe, 500, 0); + + List result = execute(plan); + + assertEquals(3, result.size()); + assertEquals(200, result.get(0).tupleValue().get("response").integerValue()); + } }