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.