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 <kor...@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 <vololo...@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.