IGNITE-9256: SQL: Remove reference to H2 result set when iteration is finished to avoid potential OOME. This closes #4550.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/114f4c84 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/114f4c84 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/114f4c84 Branch: refs/heads/ignite-9273 Commit: 114f4c848d1c5c643a9069fa29ee492417692cfe Parents: baab0a6 Author: SGrimstad <sgrims...@gridgain.com> Authored: Tue Aug 28 10:52:33 2018 +0300 Committer: devozerov <voze...@gridgain.com> Committed: Tue Aug 28 10:52:33 2018 +0300 ---------------------------------------------------------------------- .../processors/query/h2/H2FieldsIterator.java | 2 +- .../processors/query/h2/H2KeyValueIterator.java | 2 +- .../query/h2/H2ResultSetIterator.java | 33 +- ...H2ResultSetIteratorNullifyOnEndSelfTest.java | 420 +++++++++++++++++++ .../IgniteCacheQuerySelfTestSuite.java | 17 +- 5 files changed, 436 insertions(+), 38 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/114f4c84/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2FieldsIterator.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2FieldsIterator.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2FieldsIterator.java index f300c3f..26cbaee 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2FieldsIterator.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2FieldsIterator.java @@ -36,7 +36,7 @@ public class H2FieldsIterator extends H2ResultSetIterator<List<?>> { * @throws IgniteCheckedException If failed. */ public H2FieldsIterator(ResultSet data) throws IgniteCheckedException { - super(data, false, true); + super(data); } /** {@inheritDoc} */ http://git-wip-us.apache.org/repos/asf/ignite/blob/114f4c84/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2KeyValueIterator.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2KeyValueIterator.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2KeyValueIterator.java index 2088e44..31add34 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2KeyValueIterator.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2KeyValueIterator.java @@ -34,7 +34,7 @@ public class H2KeyValueIterator<K, V> extends H2ResultSetIterator<IgniteBiTuple< * @throws IgniteCheckedException If failed. */ protected H2KeyValueIterator(ResultSet data) throws IgniteCheckedException { - super(data, false, true); + super(data); } /** {@inheritDoc} */ http://git-wip-us.apache.org/repos/asf/ignite/blob/114f4c84/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2ResultSetIterator.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2ResultSetIterator.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2ResultSetIterator.java index 1b9aea3..8cc396a 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2ResultSetIterator.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2ResultSetIterator.java @@ -56,32 +56,26 @@ public abstract class H2ResultSetIterator<T> extends GridCloseableIteratorAdapte private static final long serialVersionUID = 0L; /** */ - private final ResultInterface res; + private ResultInterface res; /** */ - private final ResultSet data; + private ResultSet data; /** */ protected final Object[] row; /** */ - private final boolean closeStmt; - - /** */ private boolean hasRow; /** * @param data Data array. - * @param closeStmt If {@code true} closes result set statement when iterator is closed. - * @param needCpy {@code True} if need copy cache object's value. * @throws IgniteCheckedException If failed. */ - protected H2ResultSetIterator(ResultSet data, boolean closeStmt, boolean needCpy) throws IgniteCheckedException { + protected H2ResultSetIterator(ResultSet data) throws IgniteCheckedException { this.data = data; - this.closeStmt = closeStmt; try { - res = needCpy ? (ResultInterface)RESULT_FIELD.get(data) : null; + res = (ResultInterface)RESULT_FIELD.get(data); } catch (IllegalAccessException e) { throw new IllegalStateException(e); // Must not happen. @@ -107,8 +101,11 @@ public abstract class H2ResultSetIterator<T> extends GridCloseableIteratorAdapte return false; try { - if (!data.next()) + if (!data.next()){ + onClose(); + return false; + } if (res != null) { Value[] values = res.currentRow(); @@ -164,21 +161,15 @@ public abstract class H2ResultSetIterator<T> extends GridCloseableIteratorAdapte } /** {@inheritDoc} */ - @Override public void onClose() throws IgniteCheckedException { + @Override public void onClose(){ if (data == null) // Nothing to close. return; - if (closeStmt) { - try { - U.closeQuiet(data.getStatement()); - } - catch (SQLException e) { - throw new IgniteCheckedException(e); - } - } - U.closeQuiet(data); + + res = null; + data = null; } /** {@inheritDoc} */ http://git-wip-us.apache.org/repos/asf/ignite/blob/114f4c84/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/H2ResultSetIteratorNullifyOnEndSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/H2ResultSetIteratorNullifyOnEndSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/H2ResultSetIteratorNullifyOnEndSelfTest.java new file mode 100644 index 0000000..31b0b97 --- /dev/null +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/H2ResultSetIteratorNullifyOnEndSelfTest.java @@ -0,0 +1,420 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.h2; + +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; +import javax.cache.Cache; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.cache.query.QueryCursor; +import org.apache.ignite.cache.query.SqlFieldsQuery; +import org.apache.ignite.cache.query.SqlQuery; +import org.apache.ignite.cache.query.annotations.QuerySqlField; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.internal.processors.cache.QueryCursorImpl; +import org.apache.ignite.internal.processors.query.GridQueryCacheObjectsIterator; +import org.apache.ignite.internal.processors.query.GridQueryProcessor; +import org.apache.ignite.internal.util.lang.GridCloseableIterator; +import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; + +/** + * Test for iterator data link erasure after closing or completing + */ +public class H2ResultSetIteratorNullifyOnEndSelfTest extends GridCommonAbstractTest { + /** */ + private static final int NODES_COUNT = 2; + + /** */ + private static final int PERSON_COUNT = 20; + + /** */ + private static final String SELECT_ALL_SQL = "SELECT p.* FROM Person p ORDER BY p.salary"; + + /** */ + private static final String SELECT_MAX_SAL_SQLF = "select max(salary) from Person"; + + /** + * Non local SQL check nullification after close + */ + public void testSqlQueryClose() { + SqlQuery<String, Person> qry = new SqlQuery<>(Person.class, SELECT_ALL_SQL); + + QueryCursor<Cache.Entry<String, Person>> qryCurs = cache().query(qry); + + qryCurs.iterator(); + + qryCurs.close(); + + H2ResultSetIterator h2It = extractIteratorInnerGridIteratorInnerH2ResultSetIterator(qryCurs); + + checkIterator(h2It); + } + + /** + * Non local SQL check nullification after complete + */ + public void testSqlQueryComplete() { + SqlQuery<String, Person> qry = new SqlQuery<>(Person.class, SELECT_ALL_SQL); + + QueryCursor<Cache.Entry<String, Person>> qryCurs = cache().query(qry); + + qryCurs.getAll(); + + H2ResultSetIterator h2It = extractIteratorInnerGridIteratorInnerH2ResultSetIterator(qryCurs); + + checkIterator(h2It); + } + + /** + * Local SQL check nullification after close + */ + public void testSqlQueryLocalClose() { + SqlQuery<String, Person> qry = new SqlQuery<>(Person.class, SELECT_ALL_SQL); + + qry.setLocal(true); + + QueryCursor<Cache.Entry<String, Person>> qryCurs = cache().query(qry); + + qryCurs.iterator(); + + qryCurs.close(); + + H2ResultSetIterator h2It = extractIterableInnerH2ResultSetIterator(qryCurs); + + checkIterator(h2It); + } + + /** + * Local SQL check nullification after complete + */ + public void testSqlQueryLocalComplete() { + SqlQuery<String, Person> qry = new SqlQuery<>(Person.class, SELECT_ALL_SQL); + + qry.setLocal(true); + + QueryCursor<Cache.Entry<String, Person>> qryCurs = cache().query(qry); + + qryCurs.getAll(); + + H2ResultSetIterator h2It = extractIterableInnerH2ResultSetIterator(qryCurs); + + checkIterator(h2It); + } + + /** + * Non local SQL Fields check nullification after close + */ + public void testSqlFieldsQueryClose() { + SqlFieldsQuery qry = new SqlFieldsQuery(SELECT_MAX_SAL_SQLF); + + QueryCursor<List<?>> qryCurs = cache().query(qry); + + qryCurs.iterator(); + + qryCurs.close(); + + H2ResultSetIterator h2It = extractGridIteratorInnerH2ResultSetIterator(qryCurs); + + checkIterator(h2It); + } + + /** + * Non local SQL Fields check nullification after complete + */ + public void testSqlFieldsQueryComplete() { + SqlFieldsQuery qry = new SqlFieldsQuery(SELECT_MAX_SAL_SQLF); + + QueryCursor<List<?>> qryCurs = cache().query(qry); + + qryCurs.getAll(); + + H2ResultSetIterator h2It = extractGridIteratorInnerH2ResultSetIterator(qryCurs); + + checkIterator(h2It); + } + + /** + * Local SQL Fields check nullification after close + */ + public void testSqlFieldsQueryLocalClose() { + SqlFieldsQuery qry = new SqlFieldsQuery(SELECT_MAX_SAL_SQLF); + + qry.setLocal(true); + + QueryCursor<List<?>> qryCurs = cache().query(qry); + + qryCurs.iterator(); + + qryCurs.close(); + + H2ResultSetIterator h2It = extractGridIteratorInnerH2ResultSetIterator(qryCurs); + + checkIterator(h2It); + } + + /** + * Local SQL Fields check nullification after complete + */ + public void testSqlFieldsQueryLocalComplete() { + SqlFieldsQuery qry = new SqlFieldsQuery(SELECT_MAX_SAL_SQLF); + + qry.setLocal(true); + + QueryCursor<List<?>> qryCurs = cache().query(qry); + + qryCurs.getAll(); + + H2ResultSetIterator h2It = extractGridIteratorInnerH2ResultSetIterator(qryCurs); + + checkIterator(h2It); + } + + /** + * Common Assertion + * @param h2it target iterator + */ + private void checkIterator(H2ResultSetIterator h2it){ + if (Objects.nonNull(h2it)) + assertNull(GridTestUtils.getFieldValue(h2it, H2ResultSetIterator.class, "data")); + else + fail(); + } + + /** + * Extract H2ResultSetIterator by reflection for non local SQL cases + * @param qryCurs source cursor + * @return target iterator or null of not extracted + */ + private H2ResultSetIterator extractIteratorInnerGridIteratorInnerH2ResultSetIterator( + QueryCursor<Cache.Entry<String, Person>> qryCurs) { + if (QueryCursorImpl.class.isAssignableFrom(qryCurs.getClass())) { + Iterator inner = GridTestUtils.getFieldValue(qryCurs, QueryCursorImpl.class, "iter"); + + GridQueryCacheObjectsIterator it = GridTestUtils.getFieldValue(inner, inner.getClass(), "val$iter0"); + + Iterator<List<?>> h2RsIt = GridTestUtils.getFieldValue(it, GridQueryCacheObjectsIterator.class, "iter"); + + if (H2ResultSetIterator.class.isAssignableFrom(h2RsIt.getClass())) + return (H2ResultSetIterator)h2RsIt; + } + return null; + } + + /** + * Extract H2ResultSetIterator by reflection for local SQL cases. + * + * @param qryCurs source cursor + * @return target iterator or null of not extracted + */ + private H2ResultSetIterator extractIterableInnerH2ResultSetIterator( + QueryCursor<Cache.Entry<String, Person>> qryCurs) { + if (QueryCursorImpl.class.isAssignableFrom(qryCurs.getClass())) { + Iterable iterable = GridTestUtils.getFieldValue(qryCurs, QueryCursorImpl.class, "iterExec"); + + Iterator h2RsIt = GridTestUtils.getFieldValue(iterable, iterable.getClass(), "val$i"); + + if (H2ResultSetIterator.class.isAssignableFrom(h2RsIt.getClass())) + return (H2ResultSetIterator)h2RsIt; + } + return null; + } + + /** + * Extract H2ResultSetIterator by reflection for SQL Fields cases. + * + * @param qryCurs source cursor + * @return target iterator or null of not extracted + */ + private H2ResultSetIterator extractGridIteratorInnerH2ResultSetIterator(QueryCursor<List<?>> qryCurs) { + if (QueryCursorImpl.class.isAssignableFrom(qryCurs.getClass())) { + GridQueryCacheObjectsIterator it = GridTestUtils.getFieldValue(qryCurs, QueryCursorImpl.class, "iter"); + + Iterator<List<?>> h2RsIt = GridTestUtils.getFieldValue(it, GridQueryCacheObjectsIterator.class, "iter"); + + if (H2ResultSetIterator.class.isAssignableFrom(h2RsIt.getClass())) + return (H2ResultSetIterator)h2RsIt; + } + return null; + } + + /** + * "onClose" should remove links to data. + */ + public void testOnClose() { + try { + GridCloseableIterator it = indexing().queryLocalSql( + indexing().schema(cache().getName()), + cache().getName(), + SELECT_ALL_SQL, + null, + Collections.emptySet(), + "Person", + null, + null); + + if (H2ResultSetIterator.class.isAssignableFrom(it.getClass())) { + H2ResultSetIterator h2it = (H2ResultSetIterator)it; + + h2it.onClose(); + + assertNull(GridTestUtils.getFieldValue(h2it, H2ResultSetIterator.class, "data")); + } + else + fail(); + } + catch (IgniteCheckedException e) { + fail(e.getMessage()); + } + } + + /** + * Complete iterate should remove links to data. + */ + public void testOnComplete() { + try { + GridCloseableIterator it = indexing().queryLocalSql( + indexing().schema(cache().getName()), + cache().getName(), + SELECT_ALL_SQL, + null, + Collections.emptySet(), + "Person", + null, + null); + + if (H2ResultSetIterator.class.isAssignableFrom(it.getClass())) { + H2ResultSetIterator h2it = (H2ResultSetIterator)it; + + while (h2it.onHasNext()) + h2it.onNext(); + + assertNull(GridTestUtils.getFieldValue(h2it, H2ResultSetIterator.class, "data")); + } + else + fail(); + } + catch (IgniteCheckedException e) { + fail(e.getMessage()); + } + } + + /** {@inheritDoc} */ + @Override protected void beforeTestsStarted() throws Exception { + startGrids(NODES_COUNT); + + ignite(0).createCache( + new CacheConfiguration<String, Person>("pers").setIndexedTypes(String.class, Person.class) + ); + + awaitPartitionMapExchange(); + + populateDataIntoPerson(); + } + + /** {@inheritDoc} */ + @Override protected void afterTestsStopped() throws Exception { + stopAllGrids(); + } + + /** + * @return H2 indexing instance. + */ + private IgniteH2Indexing indexing() { + GridQueryProcessor qryProcessor = grid(0).context().query(); + + return GridTestUtils.getFieldValue(qryProcessor, GridQueryProcessor.class, "idx"); + } + + /** + * @return Cache. + */ + private IgniteCache<String, Person> cache() { + return grid(0).cache("pers"); + } + + /** + * Populate person cache with test data + */ + private void populateDataIntoPerson() { + IgniteCache<String, Person> cache = cache(); + + int personId = 0; + + for (int j = 0; j < PERSON_COUNT; j++) { + Person prsn = new Person(); + + prsn.setId("pers" + personId); + prsn.setName("Person name #" + personId); + + cache.put(prsn.getId(), prsn); + + personId++; + } + } + + /** + * + */ + private static class Person { + /** */ + @QuerySqlField(index = true) + private String id; + + /** */ + @QuerySqlField(index = true) + private String name; + + /** */ + @QuerySqlField(index = true) + private int salary; + + /** */ + public String getId() { + return id; + } + + /** */ + public void setId(String id) { + this.id = id; + } + + /** */ + public String getName() { + return name; + } + + /** */ + public void setName(String name) { + this.name = name; + } + + /** */ + public int getSalary() { + return salary; + } + + /** */ + public void setSalary(int salary) { + this.salary = salary; + } + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/114f4c84/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java index 6b3cace..2a61ce6 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java +++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java @@ -21,14 +21,11 @@ import junit.framework.TestSuite; import org.apache.ignite.internal.processors.cache.CacheIteratorScanQueryTest; import org.apache.ignite.internal.processors.cache.CacheLocalQueryDetailMetricsSelfTest; import org.apache.ignite.internal.processors.cache.CacheLocalQueryMetricsSelfTest; -import org.apache.ignite.internal.processors.cache.CacheOffheapBatchIndexingBaseTest; -import org.apache.ignite.internal.processors.cache.CacheOffheapBatchIndexingMultiTypeTest; import org.apache.ignite.internal.processors.cache.CacheOffheapBatchIndexingSingleTypeTest; import org.apache.ignite.internal.processors.cache.CachePartitionedQueryDetailMetricsDistributedSelfTest; import org.apache.ignite.internal.processors.cache.CachePartitionedQueryDetailMetricsLocalSelfTest; import org.apache.ignite.internal.processors.cache.CachePartitionedQueryMetricsDistributedSelfTest; import org.apache.ignite.internal.processors.cache.CachePartitionedQueryMetricsLocalSelfTest; -import org.apache.ignite.internal.processors.cache.CacheQueryBuildValueTest; import org.apache.ignite.internal.processors.cache.CacheQueryEvictDataLostTest; import org.apache.ignite.internal.processors.cache.CacheQueryNewClientSelfTest; import org.apache.ignite.internal.processors.cache.CacheReplicatedQueryDetailMetricsDistributedSelfTest; @@ -49,7 +46,6 @@ import org.apache.ignite.internal.processors.cache.IgniteBinaryObjectLocalQueryA import org.apache.ignite.internal.processors.cache.IgniteBinaryObjectQueryArgumentsTest; import org.apache.ignite.internal.processors.cache.IgniteBinaryWrappedObjectFieldsQuerySelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheCollocatedQuerySelfTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheConfigVariationsQueryTest; import org.apache.ignite.internal.processors.cache.IgniteCacheDeleteSqlQuerySelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheDistributedJoinCollocatedAndNotTest; import org.apache.ignite.internal.processors.cache.IgniteCacheDistributedJoinCustomAffinityMapper; @@ -61,7 +57,6 @@ import org.apache.ignite.internal.processors.cache.IgniteCacheDuplicateEntityCon import org.apache.ignite.internal.processors.cache.IgniteCacheFieldsQueryNoDataSelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheFullTextQueryNodeJoiningSelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheInsertSqlQuerySelfTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheJoinPartitionedAndReplicatedCollocationTest; import org.apache.ignite.internal.processors.cache.IgniteCacheJoinPartitionedAndReplicatedTest; import org.apache.ignite.internal.processors.cache.IgniteCacheJoinQueryWithAffinityKeyTest; import org.apache.ignite.internal.processors.cache.IgniteCacheLargeResultSelfTest; @@ -76,13 +71,10 @@ import org.apache.ignite.internal.processors.cache.IgniteCacheQueryH2IndexingLea import org.apache.ignite.internal.processors.cache.IgniteCacheQueryIndexSelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheQueryLoadSelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheSqlQueryErrorSelfTest; -import org.apache.ignite.internal.processors.cache.IgniteCacheUnionDuplicatesTest; import org.apache.ignite.internal.processors.cache.IgniteCacheUpdateSqlQuerySelfTest; import org.apache.ignite.internal.processors.cache.IgniteCheckClusterStateBeforeExecuteQueryTest; -import org.apache.ignite.internal.processors.cache.IgniteClientReconnectCacheQueriesFailoverTest; import org.apache.ignite.internal.processors.cache.IgniteCrossCachesJoinsQueryTest; import org.apache.ignite.internal.processors.cache.IgniteDynamicSqlRestoreTest; -import org.apache.ignite.internal.processors.cache.IgniteErrorOnRebalanceTest; import org.apache.ignite.internal.processors.cache.IncorrectQueryEntityTest; import org.apache.ignite.internal.processors.cache.QueryEntityCaseMismatchTest; import org.apache.ignite.internal.processors.cache.SqlFieldsQuerySelfTest; @@ -117,11 +109,6 @@ import org.apache.ignite.internal.processors.cache.index.DynamicIndexServerCoord import org.apache.ignite.internal.processors.cache.index.DynamicIndexServerNodeFIlterBasicSelfTest; import org.apache.ignite.internal.processors.cache.index.DynamicIndexServerNodeFilterCoordinatorBasicSelfTest; import org.apache.ignite.internal.processors.cache.index.H2ConnectionLeaksSelfTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexClientAtomicPartitionedNoBackupsTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexClientTransactionalPartitionedNoBackupsTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexServerAtomicPartitionedNoBackupsTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexServerTransactionalPartitionedNoBackupsTest; -import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexAbstractTest; import org.apache.ignite.internal.processors.cache.index.IgniteDecimalSelfTest; import org.apache.ignite.internal.processors.cache.index.H2DynamicColumnsClientBasicSelfTest; import org.apache.ignite.internal.processors.cache.index.H2DynamicColumnsServerBasicSelfTest; @@ -152,11 +139,9 @@ import org.apache.ignite.internal.processors.cache.local.IgniteCacheLocalQueryCa import org.apache.ignite.internal.processors.cache.local.IgniteCacheLocalQuerySelfTest; import org.apache.ignite.internal.processors.cache.query.CacheScanQueryFailoverTest; import org.apache.ignite.internal.processors.cache.query.GridCacheQueryTransformerSelfTest; -import org.apache.ignite.internal.processors.cache.query.GridCircularQueueTest; import org.apache.ignite.internal.processors.cache.query.IgniteCacheQueryCacheDestroySelfTest; import org.apache.ignite.internal.processors.cache.query.IndexingSpiQuerySelfTest; import org.apache.ignite.internal.processors.cache.query.IndexingSpiQueryTxSelfTest; -import org.apache.ignite.internal.processors.cache.query.IndexingSpiQueryWithH2IndexingSelfTest; import org.apache.ignite.internal.processors.client.ClientConnectorConfigurationValidationSelfTest; import org.apache.ignite.internal.processors.database.baseline.IgniteStableBaselineBinObjFieldsQuerySelfTest; import org.apache.ignite.internal.processors.query.IgniteCachelessQueriesSelfTest; @@ -182,6 +167,7 @@ import org.apache.ignite.internal.processors.query.SqlPushDownFunctionTest; import org.apache.ignite.internal.processors.query.SqlSchemaSelfTest; import org.apache.ignite.internal.processors.query.h2.GridH2IndexingInMemSelfTest; import org.apache.ignite.internal.processors.query.h2.GridH2IndexingOffheapSelfTest; +import org.apache.ignite.internal.processors.query.h2.H2ResultSetIteratorNullifyOnEndSelfTest; import org.apache.ignite.internal.processors.query.h2.IgniteSqlBigIntegerKeyTest; import org.apache.ignite.internal.processors.query.h2.IgniteSqlQueryMinMaxTest; import org.apache.ignite.internal.processors.query.h2.sql.BaseH2CompareQueryTest; @@ -297,6 +283,7 @@ public class IgniteCacheQuerySelfTestSuite extends TestSuite { suite.addTestSuite(IgniteCacheCollocatedQuerySelfTest.class); suite.addTestSuite(IgniteCacheLargeResultSelfTest.class); suite.addTestSuite(GridCacheQueryInternalKeysSelfTest.class); + suite.addTestSuite(H2ResultSetIteratorNullifyOnEndSelfTest.class); suite.addTestSuite(IgniteSqlBigIntegerKeyTest.class); suite.addTestSuite(IgniteCacheOffheapEvictQueryTest.class); suite.addTestSuite(IgniteCacheOffheapIndexScanTest.class);