IGNITE-9342: SQL: fixed execution of multu-statement non-colocated queries. This closes #4709.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/92af5389 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/92af5389 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/92af5389 Branch: refs/heads/ignite-627 Commit: 92af53895a0f617858b7149e6ccc4396e2e04675 Parents: ac093b9 Author: tledkov-gridgain <tled...@gridgain.com> Authored: Mon Oct 29 16:49:46 2018 +0300 Committer: devozerov <voze...@gridgain.com> Committed: Mon Oct 29 16:49:46 2018 +0300 ---------------------------------------------------------------------- .../processors/query/h2/IgniteH2Indexing.java | 3 +- .../MultipleStatementsSqlQuerySelfTest.java | 40 ++++++++++++++++---- 2 files changed, 34 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/92af5389/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java index 866ae99..5bd6f7b 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java @@ -2192,8 +2192,9 @@ public class IgniteH2Indexing implements GridQueryIndexing { res.addAll(doRunPrepared(schemaName, prepared, newQry, twoStepQry, meta, keepBinary, startTx, tracker, cancel)); + // We cannot cache two-step query for multiple statements query except the last statement if (parseRes.twoStepQuery() != null && parseRes.twoStepQueryKey() != null && - !parseRes.twoStepQuery().explain()) + !parseRes.twoStepQuery().explain() && remainingSql == null) twoStepCache.putIfAbsent(parseRes.twoStepQueryKey(), new H2TwoStepCachedQuery(meta, twoStepQry.copy())); } http://git-wip-us.apache.org/repos/asf/ignite/blob/92af5389/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/MultipleStatementsSqlQuerySelfTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/MultipleStatementsSqlQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/MultipleStatementsSqlQuerySelfTest.java index becd586..65b9795 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/MultipleStatementsSqlQuerySelfTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/MultipleStatementsSqlQuerySelfTest.java @@ -47,10 +47,8 @@ public class MultipleStatementsSqlQuerySelfTest extends GridCommonAbstractTest { /** * Test query without caches. - * - * @throws Exception If failed. */ - public void testQuery() throws Exception { + public void testQuery() { GridQueryProcessor qryProc = node.context().query(); SqlFieldsQuery qry = new SqlFieldsQuery( @@ -92,10 +90,8 @@ public class MultipleStatementsSqlQuerySelfTest extends GridCommonAbstractTest { /** * Test query without caches. - * - * @throws Exception If failed. */ - public void testQueryWithParameters() throws Exception { + public void testQueryWithParameters() { GridQueryProcessor qryProc = node.context().query(); SqlFieldsQuery qry = new SqlFieldsQuery( @@ -137,9 +133,8 @@ public class MultipleStatementsSqlQuerySelfTest extends GridCommonAbstractTest { } /** - * @throws Exception If failed. */ - public void testQueryMultipleStatementsFailed() throws Exception { + public void testQueryMultipleStatementsFailed() { final SqlFieldsQuery qry = new SqlFieldsQuery("select 1; select 1;").setSchema("PUBLIC"); GridTestUtils.assertThrows(log, @@ -151,4 +146,33 @@ public class MultipleStatementsSqlQuerySelfTest extends GridCommonAbstractTest { } }, IgniteSQLException.class, "Multiple statements queries are not supported"); } + + /** + * Check cached two-steps query. + */ + public void testCachedTwoSteps() { + List<FieldsQueryCursor<List<?>>> curs = sql("SELECT 1; SELECT 2"); + + assertEquals(2, curs.size()); + assertEquals(1, curs.get(0).getAll().get(0).get(0)); + assertEquals(2, curs.get(1).getAll().get(0).get(0)); + + curs = sql("SELECT 1; SELECT 2"); + + assertEquals(2, curs.size()); + assertEquals(1, curs.get(0).getAll().get(0).get(0)); + assertEquals(2, curs.get(1).getAll().get(0).get(0)); + } + + /** + * @param sql SQL query. + * @return Results. + */ + private List<FieldsQueryCursor<List<?>>> sql(String sql) { + GridQueryProcessor qryProc = node.context().query(); + + SqlFieldsQuery qry = new SqlFieldsQuery(sql).setSchema("PUBLIC"); + + return qryProc.querySqlFields(qry, true, false); + } }