You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ip...@apache.org on 2020/01/23 11:44:37 UTC

[ignite] branch master updated: IGNITE-12567 H2Tree goes into illegal state when non-indexed columns are dropped - Fixes #7290.

This is an automated email from the ASF dual-hosted git repository.

ipavlukhin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 41ed329  IGNITE-12567 H2Tree goes into illegal state when non-indexed columns are dropped - Fixes #7290.
41ed329 is described below

commit 41ed3294ec7e1c8384bbbf7044c9ec5c7bf2622e
Author: korlov42 <ko...@gridgain.com>
AuthorDate: Thu Jan 23 14:44:18 2020 +0300

    IGNITE-12567 H2Tree goes into illegal state when non-indexed columns are dropped - Fixes #7290.
    
    Signed-off-by: ipavlukhin <vo...@gmail.com>
---
 .../processors/query/h2/database/H2Tree.java       | 14 +++-----
 .../H2DynamicColumnsAbstractBasicSelfTest.java     | 37 ++++++++++++++++++++++
 2 files changed, 41 insertions(+), 10 deletions(-)

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 @@ public class H2Tree extends BPlusTree<H2Row, H2Row> {
     private final IndexColumn[] cols;
 
     /** */
-    private final int[] columnIds;
-
-    /** */
     private final boolean mvccEnabled;
 
     /** */
@@ -223,11 +220,6 @@ public class H2Tree extends BPlusTree<H2Row, H2Row> {
         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 @@ public class H2Tree extends BPlusTree<H2Row, H2Row> {
             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 @@ public class H2Tree extends BPlusTree<H2Row, H2Row> {
             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.QueryField;
 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 @@ public abstract class H2DynamicColumnsAbstractBasicSelfTest extends DynamicColum
         }
     }
 
+    /** */
+    @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.