Index: modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java (revision fccd26c2822cafeaa556638c6714831ab5a6aaf8) +++ modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java (date 1588231313800) @@ -172,6 +172,8 @@ @GridToStringExclude private IgniteLogger log; + private volatile long lastModificationId; + /** * Creates table. * @@ -1183,7 +1185,11 @@ /** {@inheritDoc} */ @Override public long getMaxDataModificationId() { - return 0; + return lastModificationId; + } + + public void incrementLastModificationId() { + lastModificationId = database.getNextModificationDataId(); } /** {@inheritDoc} */ Index: modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlan.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlan.java (revision fccd26c2822cafeaa556638c6714831ab5a6aaf8) +++ modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlan.java (date 1588231313805) @@ -281,6 +281,8 @@ desc.validateKeyAndValue(key, val); + tbl.incrementLastModificationId(); + return new IgniteBiTuple<>(key, val); } @@ -362,6 +364,10 @@ return new T3<>(key, oldVal, newVal); } + public void processRowForDelete(List row) { + tbl.incrementLastModificationId(); + } + /** * @return {@code True} if DML can be fast processed. */ Index: modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlMergeTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlMergeTest.java (revision fccd26c2822cafeaa556638c6714831ab5a6aaf8) +++ modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlMergeTest.java (date 1588231703685) @@ -28,6 +28,8 @@ import org.apache.ignite.testframework.LogListener; import org.junit.Test; +import static org.junit.Assert.assertNotEquals; + /** * Tests for SQL MERGE. */ @@ -88,6 +90,32 @@ Arrays.asList(1, 2000, "HOLY JESUS")); } + @Test + public void testSubQuery() throws Exception { + sql("CREATE TABLE A (id INT, name VARCHAR, PRIMARY KEY (id))"); + sql("CREATE TABLE B (id INT, a_id INT, name VARCHAR, PRIMARY KEY (id))"); + + for (int i = 0; i < 10; i++) { + sql(String.format("INSERT INTO A (id, name) VALUES (%d, 'entry_a_%d')", i, i)); + sql(String.format("INSERT INTO B (id, a_id, name) VALUES (%d, %d, 'entry_b_%d')", i + 100, i, i + 100)); + } + + List> exp = null; + for (int i = 0; i < 1; i++) + exp = sql("SELECT * FROM A WHERE id IN (SELECT a_id FROM B)"); + + sql("DELETE FROM B where a_id > 5"); + sql("UPDATE B SET a_id = 100*a_id where a_id = 5"); + sql(String.format("INSERT INTO B (id, a_id, name) VALUES (%d, %d, '%s')", 200, 5, "test")); + + List> res = sql("SELECT * FROM A WHERE id IN (SELECT a_id FROM B)"); + + assertNotNull(exp); + assertNotEquals(exp.size(), res.size()); + assertEquals(6, res.size()); + + } + /** * */ Index: modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/DmlUtils.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/DmlUtils.java (revision fccd26c2822cafeaa556638c6714831ab5a6aaf8) +++ modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/DmlUtils.java (date 1588231440896) @@ -171,7 +171,7 @@ return doUpdate(plan, cursor, pageSize); case DELETE: - return doDelete(plan.cacheContext(), cursor, pageSize); + return doDelete(plan, cursor, pageSize); default: throw new IgniteSQLException("Unexpected DML operation [mode=" + plan.mode() + ']', @@ -337,14 +337,16 @@ * @param pageSize Batch size for streaming, anything <= 0 for single page operations. * @return Results of DELETE (number of items affected AND keys that failed to be updated). */ - private static UpdateResult doDelete(GridCacheContext cctx, Iterable> cursor, int pageSize) + private static UpdateResult doDelete(UpdatePlan plan, Iterable> cursor, int pageSize) throws IgniteCheckedException { - DmlBatchSender sender = new DmlBatchSender(cctx, pageSize, 1); + DmlBatchSender sender = new DmlBatchSender(plan.cacheContext(), pageSize, 1); for (List row : cursor) { if (row.size() != 2) continue; + plan.processRowForDelete(row); + Object key = row.get(0); ClusterNode node = sender.primaryNodeByKey(key); Index: modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ConnectionManager.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ConnectionManager.java (revision fccd26c2822cafeaa556638c6714831ab5a6aaf8) +++ modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ConnectionManager.java (date 1588231313808) @@ -48,7 +48,7 @@ public class ConnectionManager { /** Default DB options. */ private static final String DEFAULT_DB_OPTIONS = ";LOCK_MODE=3;MULTI_THREADED=1;DB_CLOSE_ON_EXIT=FALSE" + - ";DEFAULT_LOCK_TIMEOUT=10000;FUNCTIONS_IN_SCHEMA=true;OPTIMIZE_REUSE_RESULTS=0;QUERY_CACHE_SIZE=0" + + ";DEFAULT_LOCK_TIMEOUT=10000;FUNCTIONS_IN_SCHEMA=true;OPTIMIZE_REUSE_RESULTS=1;QUERY_CACHE_SIZE=0" + ";MAX_OPERATION_MEMORY=0;BATCH_JOINS=1" + ";ROW_FACTORY=\"" + H2PlainRowFactory.class.getName() + "\"" + ";DEFAULT_TABLE_ENGINE=" + GridH2DefaultTableEngine.class.getName();