IGNITE-5190 - ArrayIndexOutOfBoundsException in GridMergeIndexSorted
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/3a9dba5f Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/3a9dba5f Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/3a9dba5f Branch: refs/heads/ignite-5009 Commit: 3a9dba5f86ad34736ccd278ebf91044e18cf9a6b Parents: f0051e1 Author: Sergi Vladykin <[email protected]> Authored: Thu May 11 16:01:38 2017 +0300 Committer: Sergi Vladykin <[email protected]> Committed: Thu May 11 16:01:38 2017 +0300 ---------------------------------------------------------------------- .../query/h2/twostep/GridMergeIndexSorted.java | 3 + .../query/IgniteSqlSplitterSelfTest.java | 68 ++++++++++++++++++++ 2 files changed, 71 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/3a9dba5f/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexSorted.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexSorted.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexSorted.java index f2d9de4..54c8dd4 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexSorted.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexSorted.java @@ -252,6 +252,9 @@ public final class GridMergeIndexSorted extends GridMergeIndex { * */ private void goNext() { + if (off == streams.length) + return; // All streams are done. + if (streams[off].next()) bubbleUp(streams, off, streamCmp); else http://git-wip-us.apache.org/repos/asf/ignite/blob/3a9dba5f/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSplitterSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSplitterSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSplitterSelfTest.java index ad1c8b8..f98f41b 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSplitterSelfTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSplitterSelfTest.java @@ -1609,6 +1609,37 @@ public class IgniteSqlSplitterSelfTest extends GridCommonAbstractTest { } } + /** + * @throws Exception If failed. + */ + public void testJoinWithSubquery() throws Exception { + IgniteCache<Integer, Contract> c1 = ignite(0).createCache( + cacheConfig("Contract", true, + Integer.class, Contract.class)); + + IgniteCache<Integer, PromoContract> c2 = ignite(0).createCache( + cacheConfig("PromoContract", true, + Integer.class, PromoContract.class)); + + for (int i = 0; i < 100; i++) { + int coId = i % 10; + int cust = i / 10; + c1.put( i, new Contract(coId, cust)); + } + + for (int i = 0; i < 10; i++) + c2.put(i, new PromoContract((i % 5) + 1, i)); + + final List<List<?>> res = c2.query(new SqlFieldsQuery("SELECT CO.CO_ID \n" + + "FROM PromoContract PMC \n" + + "INNER JOIN \"Contract\".Contract CO ON PMC.CO_ID = 5 \n" + + "AND PMC.CO_ID = CO.CO_ID \n" + + "INNER JOIN (SELECT CO_ID FROM PromoContract EBP WHERE EBP.CO_ID = 5 LIMIT 1) VPMC \n" + + "ON PMC.CO_ID = VPMC.CO_ID ")).getAll(); + + assertFalse(res.isEmpty()); + } + /** @throws Exception if failed. */ public void testDistributedAggregates() throws Exception { final String cacheName = "ints"; @@ -2128,4 +2159,41 @@ public class IgniteSqlSplitterSelfTest extends GridCommonAbstractTest { @QuerySqlField private int goodId; } + + /** */ + private static class Contract implements Serializable { + /** */ + @QuerySqlField(index = true) + private final int CO_ID; + + /** */ + @QuerySqlField(index = true) + private final int CUSTOMER_ID; + + /** */ + public Contract(final int CO_ID, final int CUSTOMER_ID) { + this.CO_ID = CO_ID; + this.CUSTOMER_ID = CUSTOMER_ID; + } + + } + + /** */ + public class PromoContract implements Serializable { + /** */ + @QuerySqlField(index = true, orderedGroups = { + @QuerySqlField.Group(name = "myIdx", order = 1)}) + private final int CO_ID; + + /** */ + @QuerySqlField(index = true, orderedGroups = { + @QuerySqlField.Group(name = "myIdx", order = 0)}) + private final int OFFER_ID; + + /** */ + public PromoContract(final int co_Id, final int offer_Id) { + this.CO_ID = co_Id; + this.OFFER_ID = offer_Id; + } + } }
