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.