IGNITE-12567 H2Tree goes into illegal state when non-indexed columns are dropped - Fixes #7290.

Signed-off-by: ipavlukhin <vololo100@gmail.com>
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java
index 7ab1d74..a2a3bd6 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java
@@ -80,9 +80,6 @@
     private final IndexColumn[] cols;
 
     /** */
-    private final int[] columnIds;
-
-    /** */
     private final boolean mvccEnabled;
 
     /** */
@@ -223,11 +220,6 @@
         inlineIdxs = unwrappedPk ? unwrappedColsInfo.inlineIdx() : wrappedColsInfo.inlineIdx();
         cols = unwrappedPk ? unwrappedColsInfo.cols() : wrappedColsInfo.cols();
 
-        columnIds = new int[cols.length];
-
-        for (int i = 0; i < cols.length; i++)
-            columnIds[i] = cols[i].column.getColumnId();
-
         setIos(H2ExtrasInnerIO.getVersions(inlineSize, mvccEnabled), H2ExtrasLeafIO.getVersions(inlineSize, mvccEnabled));
 
         this.rowCache = rowCache;
@@ -453,7 +445,9 @@
             return 0;
 
         for (int i = 0, len = cols.length; i < len; i++) {
-            int idx = columnIds[i];
+            IndexColumn idxCol = cols[i];
+
+            int idx = idxCol.column.getColumnId();
 
             Value v1 = r1.getValue(idx);
             Value v2 = r2.getValue(idx);
@@ -466,7 +460,7 @@
             int c = compareValues(v1, v2);
 
             if (c != 0)
-                return InlineIndexHelper.fixSort(c, cols[i].sortType);
+                return InlineIndexHelper.fixSort(c, idxCol.sortType);
         }
 
         return mvccCompare(r1, r2);
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicColumnsAbstractBasicSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicColumnsAbstractBasicSelfTest.java
index a60ff64..f0953e2 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicColumnsAbstractBasicSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicColumnsAbstractBasicSelfTest.java
@@ -33,6 +33,7 @@
 import org.apache.ignite.internal.processors.query.QueryUtils;
 import org.apache.ignite.testframework.config.GridTestProperties;
 import org.h2.jdbc.JdbcSQLException;
+import org.junit.Assert;
 import org.junit.Test;
 
 import static org.apache.ignite.testframework.config.GridTestProperties.BINARY_MARSHALLER_USE_SIMPLE_NAME_MAPPER;
@@ -769,6 +770,42 @@
         }
     }
 
+    /** */
+    @Test
+    public void testDropColumnPriorToCompoundPkIndex() throws Exception {
+        try {
+            run("CREATE TABLE test (a INT, b INT, id1 INT, id2 INT, PRIMARY KEY (id1, id2))");
+
+            run("INSERT INTO test (a, b, id1, id2) VALUES (1, 2, 3, 4)");
+
+            String qry = "SELECT a, id1, id2 FROM test WHERE id1 = 3 AND id2 = 4";
+
+            List<List<?>> resBefore = run(qry);
+
+            Assert.assertEquals(1, resBefore.size());
+
+            run("ALTER TABLE test DROP COLUMN b");
+
+            run("SELECT * FROM test WHERE id1 = 3 AND id2 = 4");
+
+            List<List<?>> resAfter = run(qry);
+
+            Assert.assertEquals(1, resAfter.size());
+
+            Assert.assertEquals(resBefore, resAfter);
+
+            String plan = (String)run("EXPLAIN SELECT * FROM test WHERE id1 = 3 AND id2 = 4").get(0).get(0);
+
+            String pkIdxName = "PUBLIC.\"_key_PK\"";
+
+            Assert.assertTrue("Query plan does not contain index '" + pkIdxName + "': plan=" + plan,
+                plan.contains(pkIdxName));
+        }
+        finally {
+            run("DROP TABLE IF EXISTS test");
+        }
+    }
+
     /**
      * Test that {@code ADD COLUMN} fails for tables that have flat value.
      * @param tblName table name.