ignite-db - fix for NPE GG-11088
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java
index 12c2240..3914bd7 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java
@@ -28,6 +28,7 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import javax.cache.CacheException;
 import org.apache.ignite.IgniteException;
+import org.apache.ignite.internal.GridKernalContext;
 import org.h2.engine.Constants;
 import org.h2.engine.Session;
 import org.h2.index.BaseIndex;
@@ -69,21 +70,31 @@
     /** */
     private int fetchedCnt;
 
+    /** */
+    private final GridKernalContext ctx;
+
     /**
+     * @param ctx Context.
      * @param tbl Table.
      * @param name Index name.
      * @param type Type.
      * @param cols Columns.
      */
-    public GridMergeIndex(GridMergeTable tbl, String name, IndexType type, IndexColumn[] cols) {
+    public GridMergeIndex(GridKernalContext ctx,
+        GridMergeTable tbl,
+        String name,
+        IndexType type,
+        IndexColumn[] cols) {
+        this.ctx = ctx;
+
         initBaseIndex(tbl, 0, name, cols, type);
     }
 
     /**
-     *
+     * @param ctx Context.
      */
-    protected GridMergeIndex() {
-        // No-op.
+    protected GridMergeIndex(GridKernalContext ctx) {
+        this.ctx = ctx;
     }
 
     /**
@@ -94,6 +105,19 @@
     }
 
     /**
+     * Fails index if any source node is left.
+     */
+    protected final void checkSourceNodesAlive() {
+        for (UUID nodeId : sources()) {
+            if (!ctx.discovery().alive(nodeId)) {
+                fail(nodeId);
+
+                return;
+            }
+        }
+    }
+
+    /**
      * @param nodeId Node ID.
      * @return {@code true} If this index needs data from the given source node.
      */
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java
index 501480a..5639340 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java
@@ -24,6 +24,7 @@
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 import javax.cache.CacheException;
+import org.apache.ignite.internal.GridKernalContext;
 import org.h2.index.Cursor;
 import org.h2.index.IndexType;
 import org.h2.result.Row;
@@ -40,25 +41,27 @@
     private final BlockingQueue<GridResultPage> queue = new LinkedBlockingQueue<>();
 
     /**
+     * @param ctx Context.
      * @param tbl  Table.
      * @param name Index name.
      */
-    public GridMergeIndexUnsorted(GridMergeTable tbl, String name) {
-        super(tbl, name, IndexType.createScan(false), IndexColumn.wrap(tbl.getColumns()));
+    public GridMergeIndexUnsorted(GridKernalContext ctx, GridMergeTable tbl, String name) {
+        super(ctx, tbl, name, IndexType.createScan(false), IndexColumn.wrap(tbl.getColumns()));
     }
 
     /**
+     * @param ctx Context.
      * @return Dummy index instance.
      */
-    public static GridMergeIndexUnsorted createDummy() {
-        return new GridMergeIndexUnsorted();
+    public static GridMergeIndexUnsorted createDummy(GridKernalContext ctx) {
+        return new GridMergeIndexUnsorted(ctx);
     }
 
     /**
-     *
+     * @param ctx Context.
      */
-    private GridMergeIndexUnsorted() {
-        // No-op.
+    private GridMergeIndexUnsorted(GridKernalContext ctx) {
+        super(ctx);
     }
 
     /** {@inheritDoc} */
@@ -94,7 +97,7 @@
                         if (page != null)
                             break;
 
-                        ((GridMergeTable)table).checkSourceNodesAlive();
+                        checkSourceNodesAlive();
                     }
 
                     if (page.isLast())
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeTable.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeTable.java
index adfd220..a86cbcd 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeTable.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeTable.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.processors.query.h2.twostep;
 
 import java.util.ArrayList;
-import java.util.UUID;
 import org.apache.ignite.internal.GridKernalContext;
 import org.h2.command.ddl.CreateTableData;
 import org.h2.engine.Session;
@@ -47,20 +46,7 @@
         super(data);
 
         this.ctx = ctx;
-        idx = new GridMergeIndexUnsorted(this, "merge_scan");
-    }
-
-    /**
-     * Fails merge table if any source node is left.
-     */
-    public void checkSourceNodesAlive() {
-        for (UUID nodeId : idx.sources()) {
-            if (!ctx.discovery().alive(nodeId)) {
-                idx.fail(nodeId);
-
-                return;
-            }
-        }
+        idx = new GridMergeIndexUnsorted(ctx, this, "merge_scan");
     }
 
     /** {@inheritDoc} */
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
index 828d9bd..47ab083 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
@@ -532,7 +532,7 @@
                     fakeTable(r.conn, tblIdx++).setInnerTable(tbl);
                 }
                 else
-                    idx = GridMergeIndexUnsorted.createDummy();
+                    idx = GridMergeIndexUnsorted.createDummy(ctx);
 
                 for (ClusterNode node : nodes)
                     idx.addSource(node.id());