This is an automated email from the ASF dual-hosted git repository.

ppa pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 4de0999022 IGNITE-21094 Sql. Combine single/script query execution 
methods into a single one (#3536)
4de0999022 is described below

commit 4de09990228dff81f822b70c7bd4bc36e66f525a
Author: Pavel Pereslegin <[email protected]>
AuthorDate: Wed Apr 3 15:51:31 2024 +0300

    IGNITE-21094 Sql. Combine single/script query execution methods into a 
single one (#3536)
---
 .../client/handler/JdbcQueryEventHandlerImpl.java  | 36 ++++++-----------
 .../requests/sql/ClientSqlExecuteRequest.java      |  2 +-
 .../handler/JdbcQueryEventHandlerImplTest.java     |  4 +-
 .../client/fakes/FakeIgniteQueryProcessor.java     | 34 +++++++---------
 .../benchmark/AbstractMultiNodeBenchmark.java      |  4 +-
 .../ignite/internal/benchmark/SelectBenchmark.java | 15 ++++++--
 .../benchmark/SqlMultiStatementBenchmark.java      | 15 ++++++--
 .../sql/engine/BaseSqlMultiStatementTest.java      |  9 ++++-
 .../ignite/internal/sql/api/IgniteSqlImpl.java     | 17 ++++----
 .../ignite/internal/sql/engine/QueryProcessor.java | 32 ++-------------
 .../internal/sql/engine/SqlQueryProcessor.java     | 45 ++++++++--------------
 .../ignite/internal/sql/engine/util/Commons.java   | 10 +++++
 .../ignite/internal/sql/api/IgniteSqlImplTest.java | 20 +++++-----
 .../sql/engine/exec/TransactionEnlistTest.java     | 13 +------
 .../internal/sql/engine/util/QueryCheckerTest.java | 13 +------
 .../internal/sql/engine/util/QueryCheckerImpl.java |  4 +-
 16 files changed, 113 insertions(+), 160 deletions(-)

diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImpl.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImpl.java
index 5f74fe6819..5c6a8335ff 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImpl.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImpl.java
@@ -157,27 +157,15 @@ public class JdbcQueryEventHandlerImpl implements 
JdbcQueryEventHandler {
         }
 
         InternalTransaction tx = req.autoCommit() ? null : 
connectionContext.getOrStartTransaction();
-        SqlProperties properties = createProperties(req.getStmtType());
+        SqlProperties properties = createProperties(req.getStmtType(), 
req.multiStatement());
 
-        CompletableFuture<AsyncSqlCursor<InternalSqlRow>> result;
-
-        if (req.multiStatement()) {
-            result = processor.queryScriptAsync(
-                    properties,
-                    igniteTransactions,
-                    tx,
-                    req.sqlQuery(),
-                    req.arguments() == null ? OBJECT_EMPTY_ARRAY : 
req.arguments()
-            );
-        } else {
-            result = processor.querySingleAsync(
-                    properties,
-                    igniteTransactions,
-                    tx,
-                    req.sqlQuery(),
-                    req.arguments() == null ? OBJECT_EMPTY_ARRAY : 
req.arguments()
-            );
-        }
+        CompletableFuture<AsyncSqlCursor<InternalSqlRow>> result = 
processor.queryAsync(
+                properties,
+                igniteTransactions,
+                tx,
+                req.sqlQuery(),
+                req.arguments() == null ? OBJECT_EMPTY_ARRAY : req.arguments()
+        );
 
         return result.thenCompose(cursor -> createJdbcResult(new 
JdbcQueryCursor<>(req.maxRows(), cursor), req))
                 .exceptionally(t -> {
@@ -189,12 +177,12 @@ public class JdbcQueryEventHandlerImpl implements 
JdbcQueryEventHandler {
                 });
     }
 
-    private static SqlProperties createProperties(JdbcStatementType stmtType) {
+    private static SqlProperties createProperties(JdbcStatementType stmtType, 
boolean multiStatement) {
         Set<SqlQueryType> allowedTypes;
 
         switch (stmtType) {
             case ANY_STATEMENT_TYPE:
-                allowedTypes = SqlQueryType.SINGLE_STMT_TYPES;
+                allowedTypes = multiStatement ? SqlQueryType.ALL : 
SqlQueryType.SINGLE_STMT_TYPES;
                 break;
             case SELECT_STATEMENT_TYPE:
                 allowedTypes = SELECT_STATEMENT_QUERIES;
@@ -287,9 +275,9 @@ public class JdbcQueryEventHandlerImpl implements 
JdbcQueryEventHandler {
             return CompletableFuture.failedFuture(new 
IgniteInternalException(CONNECTION_ERR, "Connection is closed"));
         }
 
-        SqlProperties properties = 
createProperties(JdbcStatementType.UPDATE_STATEMENT_TYPE);
+        SqlProperties properties = 
createProperties(JdbcStatementType.UPDATE_STATEMENT_TYPE, false);
 
-        CompletableFuture<AsyncSqlCursor<InternalSqlRow>> result = 
processor.querySingleAsync(
+        CompletableFuture<AsyncSqlCursor<InternalSqlRow>> result = 
processor.queryAsync(
                 properties,
                 igniteTransactions,
                 tx,
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlExecuteRequest.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlExecuteRequest.java
index 6cf39ac297..e132969f60 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlExecuteRequest.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlExecuteRequest.java
@@ -167,7 +167,7 @@ public class ClientSqlExecuteRequest {
                     .set(QueryProperty.ALLOWED_QUERY_TYPES, 
SqlQueryType.SINGLE_STMT_TYPES)
                     .build();
 
-            CompletableFuture<AsyncResultSet<SqlRow>> fut = 
qryProc.querySingleAsync(
+            CompletableFuture<AsyncResultSet<SqlRow>> fut = qryProc.queryAsync(
                             properties, transactions, (InternalTransaction) 
transaction, query, arguments)
                     .thenCompose(cur -> cur.requestNextAsync(pageSize)
                             .thenApply(
diff --git 
a/modules/client-handler/src/test/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImplTest.java
 
b/modules/client-handler/src/test/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImplTest.java
index d2fdf603c1..1ec4f6f40a 100644
--- 
a/modules/client-handler/src/test/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImplTest.java
+++ 
b/modules/client-handler/src/test/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImplTest.java
@@ -161,7 +161,7 @@ class JdbcQueryEventHandlerImplTest extends 
BaseIgniteAbstractTest {
 
     @Test
     public void singleTxUsedForMultipleOperations() {
-        when(queryProcessor.querySingleAsync(any(), any(), any(), any(), 
any(Object[].class)))
+        when(queryProcessor.queryAsync(any(), any(), any(), any(), 
any(Object[].class)))
                 .thenReturn(CompletableFuture.failedFuture(new 
RuntimeException("Expected")));
 
         InternalTransaction tx = mock(InternalTransaction.class);
@@ -194,7 +194,7 @@ class JdbcQueryEventHandlerImplTest extends 
BaseIgniteAbstractTest {
         verify(tx).commitAsync();
 
         verifyNoMoreInteractions(igniteTransactions);
-        verify(queryProcessor, times(5)).querySingleAsync(any(), any(), any(), 
any(), any(Object[].class));
+        verify(queryProcessor, times(5)).queryAsync(any(), any(), any(), 
any(), any(Object[].class));
     }
 
     private long acquireConnectionId() {
diff --git 
a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeIgniteQueryProcessor.java
 
b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeIgniteQueryProcessor.java
index 855d92234f..c50000c566 100644
--- 
a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeIgniteQueryProcessor.java
+++ 
b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeIgniteQueryProcessor.java
@@ -28,6 +28,7 @@ import org.apache.ignite.internal.sql.engine.InternalSqlRow;
 import org.apache.ignite.internal.sql.engine.QueryProcessor;
 import org.apache.ignite.internal.sql.engine.prepare.QueryMetadata;
 import org.apache.ignite.internal.sql.engine.property.SqlProperties;
+import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.internal.tx.InternalTransaction;
 import org.apache.ignite.sql.SqlException;
 import org.apache.ignite.tx.IgniteTransactions;
@@ -48,7 +49,7 @@ public class FakeIgniteQueryProcessor implements 
QueryProcessor {
     }
 
     @Override
-    public CompletableFuture<AsyncSqlCursor<InternalSqlRow>> querySingleAsync(
+    public CompletableFuture<AsyncSqlCursor<InternalSqlRow>> queryAsync(
             SqlProperties properties,
             IgniteTransactions transactions,
             @Nullable InternalTransaction transaction,
@@ -59,30 +60,21 @@ public class FakeIgniteQueryProcessor implements 
QueryProcessor {
             return CompletableFuture.failedFuture(new 
SqlException(STMT_VALIDATION_ERR, "Query failed"));
         }
 
-        return CompletableFuture.completedFuture(new FakeCursor(qry, 
properties, params, this));
-    }
-
-    @Override
-    public CompletableFuture<AsyncSqlCursor<InternalSqlRow>> queryScriptAsync(
-            SqlProperties properties,
-            IgniteTransactions transactions,
-            @Nullable InternalTransaction transaction,
-            String qry,
-            Object... params
-    ) {
-        var sb = new StringBuilder(qry);
+        if (Commons.isMultiStatementQueryAllowed(properties)) {
+            var sb = new StringBuilder(qry);
 
-        sb.append(", arguments: [");
+            sb.append(", arguments: [");
 
-        for (Object arg : params) {
-            sb.append(arg).append(", ");
-        }
+            for (Object arg : params) {
+                sb.append(arg).append(", ");
+            }
 
-        sb.append(']').append(", ")
-                
.append("defaultSchema=").append(properties.getOrDefault(DEFAULT_SCHEMA, "<not 
set>")).append(", ")
-                
.append("defaultQueryTimeout=").append(properties.get(QUERY_TIMEOUT));
+            sb.append(']').append(", ")
+                    
.append("defaultSchema=").append(properties.getOrDefault(DEFAULT_SCHEMA, "<not 
set>")).append(", ")
+                    
.append("defaultQueryTimeout=").append(properties.get(QUERY_TIMEOUT));
 
-        lastScript = sb.toString();
+            lastScript = sb.toString();
+        }
 
         return CompletableFuture.completedFuture(new FakeCursor(qry, 
properties, params, this));
     }
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/AbstractMultiNodeBenchmark.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/AbstractMultiNodeBenchmark.java
index 3b58f8f5af..c7a4f91def 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/AbstractMultiNodeBenchmark.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/AbstractMultiNodeBenchmark.java
@@ -84,7 +84,7 @@ public class AbstractMultiNodeBenchmark {
             var createZoneStatement = "CREATE ZONE IF NOT EXISTS " + ZONE_NAME 
+ " WITH partitions=" + partitionCount();
 
             getAllFromCursor(
-                    await(queryEngine.querySingleAsync(
+                    await(queryEngine.queryAsync(
                             SqlPropertiesHelper.emptyProperties(), 
clusterNode.transactions(), null, createZoneStatement
                     ))
             );
@@ -130,7 +130,7 @@ public class AbstractMultiNodeBenchmark {
         createTableStatement += "\nWITH primary_zone='" + ZONE_NAME + "'";
 
         getAllFromCursor(
-                await(clusterNode.queryEngine().querySingleAsync(
+                await(clusterNode.queryEngine().queryAsync(
                         SqlPropertiesHelper.emptyProperties(), 
clusterNode.transactions(), null, createTableStatement
                 ))
         );
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/SelectBenchmark.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/SelectBenchmark.java
index 24b8b6107e..ffb0cd1bc1 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/SelectBenchmark.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/SelectBenchmark.java
@@ -31,6 +31,8 @@ import org.apache.ignite.client.IgniteClient;
 import org.apache.ignite.internal.sql.engine.AsyncSqlCursor;
 import org.apache.ignite.internal.sql.engine.InternalSqlRow;
 import org.apache.ignite.internal.sql.engine.QueryProcessor;
+import org.apache.ignite.internal.sql.engine.QueryProperty;
+import org.apache.ignite.internal.sql.engine.SqlQueryType;
 import org.apache.ignite.internal.sql.engine.property.SqlProperties;
 import org.apache.ignite.internal.sql.engine.property.SqlPropertiesHelper;
 import org.apache.ignite.internal.util.AsyncCursor.BatchedResult;
@@ -213,7 +215,14 @@ public class SelectBenchmark extends 
AbstractMultiNodeBenchmark {
      */
     @State(Scope.Benchmark)
     public static class SqlInternalApiState {
-        private final SqlProperties properties = 
SqlPropertiesHelper.emptyProperties();
+        private final SqlProperties properties = 
SqlPropertiesHelper.newBuilder()
+                .set(QueryProperty.ALLOWED_QUERY_TYPES, 
SqlQueryType.SINGLE_STMT_TYPES)
+                .build();
+
+        private final SqlProperties scriptProperties = 
SqlPropertiesHelper.newBuilder()
+                .set(QueryProperty.ALLOWED_QUERY_TYPES, SqlQueryType.ALL)
+                .build();
+
         private final QueryProcessor queryProc = clusterNode.queryEngine();
         private int pageSize;
 
@@ -226,11 +235,11 @@ public class SelectBenchmark extends 
AbstractMultiNodeBenchmark {
         }
 
         private Iterator<InternalSqlRow> query(String sql, Object... args) {
-            return handleFirstBatch(queryProc.querySingleAsync(properties, 
clusterNode.transactions(), null, sql, args));
+            return handleFirstBatch(queryProc.queryAsync(properties, 
clusterNode.transactions(), null, sql, args));
         }
 
         private Iterator<InternalSqlRow> script(String sql, Object... args) {
-            return handleFirstBatch(queryProc.queryScriptAsync(properties, 
clusterNode.transactions(), null, sql, args));
+            return handleFirstBatch(queryProc.queryAsync(scriptProperties, 
clusterNode.transactions(), null, sql, args));
         }
 
         private Iterator<InternalSqlRow> 
handleFirstBatch(CompletableFuture<AsyncSqlCursor<InternalSqlRow>> cursorFut) {
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/SqlMultiStatementBenchmark.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/SqlMultiStatementBenchmark.java
index 661f282871..f078fa32fb 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/SqlMultiStatementBenchmark.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/benchmark/SqlMultiStatementBenchmark.java
@@ -33,6 +33,8 @@ import org.apache.ignite.internal.lang.IgniteStringBuilder;
 import org.apache.ignite.internal.sql.engine.AsyncSqlCursor;
 import org.apache.ignite.internal.sql.engine.InternalSqlRow;
 import org.apache.ignite.internal.sql.engine.QueryProcessor;
+import org.apache.ignite.internal.sql.engine.QueryProperty;
+import org.apache.ignite.internal.sql.engine.SqlQueryType;
 import org.apache.ignite.internal.sql.engine.property.SqlProperties;
 import org.apache.ignite.internal.sql.engine.property.SqlPropertiesHelper;
 import org.apache.ignite.internal.util.AsyncCursor.BatchedResult;
@@ -358,7 +360,14 @@ public class SqlMultiStatementBenchmark extends 
AbstractMultiNodeBenchmark {
 
     /** Executes SQL query/script using internal API. */
     private static class QueryRunner {
-        private final SqlProperties props = 
SqlPropertiesHelper.emptyProperties();
+        private final SqlProperties props = SqlPropertiesHelper.newBuilder()
+                .set(QueryProperty.ALLOWED_QUERY_TYPES, 
SqlQueryType.SINGLE_STMT_TYPES)
+                .build();
+
+        private final SqlProperties scriptProps = 
SqlPropertiesHelper.newBuilder()
+                .set(QueryProperty.ALLOWED_QUERY_TYPES, SqlQueryType.ALL)
+                .build();
+
         private final QueryProcessor queryProcessor;
         private final IgniteTransactions transactions;
         private final int pageSize;
@@ -371,14 +380,14 @@ public class SqlMultiStatementBenchmark extends 
AbstractMultiNodeBenchmark {
 
         Iterator<InternalSqlRow> execQuery(String sql, Object ... args) {
             AsyncSqlCursor<InternalSqlRow> cursor =
-                    queryProcessor.querySingleAsync(props, transactions, null, 
sql, args).join();
+                    queryProcessor.queryAsync(props, transactions, null, sql, 
args).join();
 
             return new InternalResultsIterator(cursor, pageSize);
         }
 
         Iterator<InternalSqlRow> execScript(String sql, Object ... args) {
             AsyncSqlCursor<InternalSqlRow> cursor =
-                    queryProcessor.queryScriptAsync(props, transactions, null, 
sql, args).join();
+                    queryProcessor.queryAsync(scriptProps, transactions, null, 
sql, args).join();
 
             return new InternalResultsIterator(cursor, pageSize);
         }
diff --git 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/BaseSqlMultiStatementTest.java
 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/BaseSqlMultiStatementTest.java
index a48a7347e1..d0ae8c8584 100644
--- 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/BaseSqlMultiStatementTest.java
+++ 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/BaseSqlMultiStatementTest.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.sql.engine;
 
 import static java.util.concurrent.CompletableFuture.completedFuture;
-import static 
org.apache.ignite.internal.sql.engine.property.SqlPropertiesHelper.emptyProperties;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
 import static 
org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -33,6 +32,8 @@ import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Function;
 import org.apache.ignite.internal.sql.BaseSqlIntegrationTest;
+import org.apache.ignite.internal.sql.engine.property.SqlProperties;
+import org.apache.ignite.internal.sql.engine.property.SqlPropertiesHelper;
 import org.apache.ignite.internal.tx.InternalTransaction;
 import org.apache.ignite.internal.util.AsyncCursor.BatchedResult;
 import org.jetbrains.annotations.Nullable;
@@ -74,8 +75,12 @@ public abstract class BaseSqlMultiStatementTest extends 
BaseSqlIntegrationTest {
     }
 
     AsyncSqlCursor<InternalSqlRow> runScript(String query, @Nullable 
InternalTransaction tx, Object ... params) {
+        SqlProperties properties = SqlPropertiesHelper.newBuilder()
+                .set(QueryProperty.ALLOWED_QUERY_TYPES, SqlQueryType.ALL)
+                .build();
+
         AsyncSqlCursor<InternalSqlRow> cursor = await(
-                queryProcessor().queryScriptAsync(emptyProperties(), 
igniteTx(), tx, query, params)
+                queryProcessor().queryAsync(properties, igniteTx(), tx, query, 
params)
         );
 
         return Objects.requireNonNull(cursor);
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/api/IgniteSqlImpl.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/api/IgniteSqlImpl.java
index 69bd26fc9b..afa6e0e44b 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/api/IgniteSqlImpl.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/api/IgniteSqlImpl.java
@@ -344,7 +344,7 @@ public class IgniteSqlImpl implements IgniteSql, 
IgniteComponent {
                     .set(QueryProperty.ALLOWED_QUERY_TYPES, 
SqlQueryType.SINGLE_STMT_TYPES)
                     .build();
 
-            result = queryProcessor.querySingleAsync(properties, transactions, 
(InternalTransaction) transaction, query, arguments)
+            result = queryProcessor.queryAsync(properties, transactions, 
(InternalTransaction) transaction, query, arguments)
                     .thenCompose(cur -> {
                                 if (!busyLock.enterBusy()) {
                                     cur.closeAsync();
@@ -461,7 +461,7 @@ public class IgniteSqlImpl implements IgniteSql, 
IgniteComponent {
                 }
 
                 try {
-                    return queryProcessor.querySingleAsync(properties, 
transactions, transaction, query, args)
+                    return queryProcessor.queryAsync(properties, transactions, 
transaction, query, args)
                             .thenCompose(cursor -> {
                                 if (!enterBusy.get()) {
                                     cursor.closeAsync();
@@ -538,10 +538,6 @@ public class IgniteSqlImpl implements IgniteSql, 
IgniteComponent {
             return CompletableFuture.failedFuture(nodeIsStoppingException());
         }
 
-        SqlProperties properties = SqlPropertiesHelper.newBuilder()
-                .set(QueryProperty.ALLOWED_QUERY_TYPES, SqlQueryType.ALL)
-                .build();
-
         try {
             return executeScriptCore(
                     queryProcessor,
@@ -550,7 +546,7 @@ public class IgniteSqlImpl implements IgniteSql, 
IgniteComponent {
                     busyLock::leaveBusy,
                     query,
                     arguments,
-                    properties);
+                    SqlPropertiesHelper.emptyProperties());
         } finally {
             busyLock.leaveBusy();
         }
@@ -576,8 +572,13 @@ public class IgniteSqlImpl implements IgniteSql, 
IgniteComponent {
             String query,
             @Nullable Object[] arguments,
             SqlProperties properties) {
+
+        SqlProperties properties0 = SqlPropertiesHelper.chain(properties, 
SqlPropertiesHelper.newBuilder()
+                .set(QueryProperty.ALLOWED_QUERY_TYPES, SqlQueryType.ALL)
+                .build());
+
         CompletableFuture<AsyncSqlCursor<InternalSqlRow>> f =
-                queryProcessor.queryScriptAsync(properties, transactions, 
null, query, arguments);
+                queryProcessor.queryAsync(properties0, transactions, null, 
query, arguments);
 
         CompletableFuture<Void> resFut = new CompletableFuture<>();
         ScriptHandler handler = new ScriptHandler(resFut, enterBusy, 
leaveBusy);
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/QueryProcessor.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/QueryProcessor.java
index 190b3a6a58..42c04e39c9 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/QueryProcessor.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/QueryProcessor.java
@@ -49,44 +49,20 @@ public interface QueryProcessor extends IgniteComponent {
             String qry, Object... params);
 
     /**
-     * Execute the single statement query with given schema name and 
parameters.
+     * Execute the query with given schema name and parameters.
      *
-     * <p>If the query string contains more than one statement the 
IgniteException will be thrown.
-     *
-     * @param properties User query properties. See {@link QueryProperty} for 
available properties.
-     * @param transactions Transactions facade.
-     * @param transaction A transaction to use for query execution. If null, 
an implicit transaction
-     *      will be started by provided transactions facade.
-     * @param qry Single statement SQL query.
-     * @param params Query parameters.
-     * @return Sql cursor.
-     *
-     * @throws IgniteException in case of an error.
-     * @see QueryProperty
-     */
-    CompletableFuture<AsyncSqlCursor<InternalSqlRow>> querySingleAsync(
-            SqlProperties properties,
-            IgniteTransactions transactions,
-            @Nullable InternalTransaction transaction,
-            String qry,
-            Object... params
-    );
-
-    /**
-     * Execute the multi-statement query with given schema name and parameters.
-     *
-     * @param properties User query properties. See {@link QueryProperty} for 
available properties.
+     * @param properties Query properties. See {@link QueryProperty} for 
available properties.
      * @param transactions Transactions facade.
      * @param transaction A transaction to use for query execution. If null, 
an implicit transaction
      *      will be started by provided transactions facade.
-     * @param qry Multi statement SQL query.
+     * @param qry SQL query.
      * @param params Query parameters.
      * @return Sql cursor.
      *
      * @throws IgniteException in case of an error.
      * @see QueryProperty
      */
-    CompletableFuture<AsyncSqlCursor<InternalSqlRow>> queryScriptAsync(
+    CompletableFuture<AsyncSqlCursor<InternalSqlRow>> queryAsync(
             SqlProperties properties,
             IgniteTransactions transactions,
             @Nullable InternalTransaction transaction,
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java
index 686c892bab..119ad36098 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java
@@ -114,6 +114,7 @@ import 
org.apache.ignite.internal.sql.engine.tx.QueryTransactionContext;
 import org.apache.ignite.internal.sql.engine.tx.QueryTransactionWrapper;
 import org.apache.ignite.internal.sql.engine.tx.ScriptTransactionContext;
 import org.apache.ignite.internal.sql.engine.util.BaseQueryContext;
+import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.internal.sql.engine.util.TypeUtils;
 import org.apache.ignite.internal.sql.engine.util.cache.Cache;
 import org.apache.ignite.internal.sql.engine.util.cache.CacheFactory;
@@ -480,7 +481,7 @@ public class SqlQueryProcessor implements QueryProcessor {
 
     /** {@inheritDoc} */
     @Override
-    public CompletableFuture<AsyncSqlCursor<InternalSqlRow>> querySingleAsync(
+    public CompletableFuture<AsyncSqlCursor<InternalSqlRow>> queryAsync(
             SqlProperties properties,
             IgniteTransactions transactions,
             @Nullable InternalTransaction transaction,
@@ -492,27 +493,13 @@ public class SqlQueryProcessor implements QueryProcessor {
         }
 
         try {
-            return querySingle0(properties, new 
QueryTransactionContext(transactions, transaction), qry, params);
-        } finally {
-            busyLock.leaveBusy();
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public CompletableFuture<AsyncSqlCursor<InternalSqlRow>> queryScriptAsync(
-            SqlProperties properties,
-            IgniteTransactions transactions,
-            @Nullable InternalTransaction transaction,
-            String qry,
-            Object... params
-    ) {
-        if (!busyLock.enterBusy()) {
-            throw new IgniteInternalException(NODE_STOPPING_ERR, new 
NodeStoppingException());
-        }
+            SqlProperties properties0 = SqlPropertiesHelper.chain(properties, 
DEFAULT_PROPERTIES);
 
-        try {
-            return queryScript0(properties, new 
QueryTransactionContext(transactions, transaction), qry, params);
+            if (Commons.isMultiStatementQueryAllowed(properties0)) {
+                return queryScript(properties0, new 
QueryTransactionContext(transactions, transaction), qry, params);
+            } else {
+                return querySingle(properties0, new 
QueryTransactionContext(transactions, transaction), qry, params);
+            }
         } finally {
             busyLock.leaveBusy();
         }
@@ -552,15 +539,14 @@ public class SqlQueryProcessor implements QueryProcessor {
         });
     }
 
-    private CompletableFuture<AsyncSqlCursor<InternalSqlRow>> querySingle0(
+    private CompletableFuture<AsyncSqlCursor<InternalSqlRow>> querySingle(
             SqlProperties properties,
             QueryTransactionContext txCtx,
             String sql,
             Object... params
     ) {
-        SqlProperties properties0 = SqlPropertiesHelper.chain(properties, 
DEFAULT_PROPERTIES);
-        String schemaName = properties0.get(QueryProperty.DEFAULT_SCHEMA);
-        ZoneId timeZoneId = properties0.get(QueryProperty.TIME_ZONE_ID);
+        String schemaName = properties.get(QueryProperty.DEFAULT_SCHEMA);
+        ZoneId timeZoneId = properties.get(QueryProperty.TIME_ZONE_ID);
 
         QueryCancel queryCancel = new QueryCancel();
 
@@ -571,7 +557,7 @@ public class SqlQueryProcessor implements QueryProcessor {
                 : CompletableFuture.supplyAsync(() -> parseAndCache(sql), 
taskExecutor);
 
         return start.thenCompose(result -> {
-            validateParsedStatement(properties0, result);
+            validateParsedStatement(properties, result);
             validateDynamicParameters(result.dynamicParamsCount(), params, 
true);
 
             QueryTransactionWrapper txWrapper = 
txCtx.getOrStartImplicit(result.queryType());
@@ -600,15 +586,14 @@ public class SqlQueryProcessor implements QueryProcessor {
         });
     }
 
-    private CompletableFuture<AsyncSqlCursor<InternalSqlRow>> queryScript0(
+    private CompletableFuture<AsyncSqlCursor<InternalSqlRow>> queryScript(
             SqlProperties properties,
             QueryTransactionContext txCtx,
             String sql,
             Object... params
     ) {
-        SqlProperties properties0 = SqlPropertiesHelper.chain(properties, 
DEFAULT_PROPERTIES);
-        String schemaName = properties0.get(QueryProperty.DEFAULT_SCHEMA);
-        ZoneId timeZoneId = properties0.get(QueryProperty.TIME_ZONE_ID);
+        String schemaName = properties.get(QueryProperty.DEFAULT_SCHEMA);
+        ZoneId timeZoneId = properties.get(QueryProperty.TIME_ZONE_ID);
 
         CompletableFuture<?> start = new CompletableFuture<>();
 
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
index 4e38162302..a81ca55586 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.sql.engine.util;
 
 import static org.apache.calcite.rel.hint.HintPredicates.AGGREGATE;
 import static org.apache.calcite.rel.hint.HintPredicates.JOIN;
+import static 
org.apache.ignite.internal.sql.engine.QueryProperty.ALLOWED_QUERY_TYPES;
 import static 
org.apache.ignite.internal.sql.engine.util.BaseQueryContext.CLUSTER;
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 import static org.apache.ignite.lang.ErrorGroups.Common.INTERNAL_ERR;
@@ -48,6 +49,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.UUID;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -99,6 +101,7 @@ import 
org.apache.ignite.internal.sql.engine.metadata.cost.IgniteCostFactory;
 import org.apache.ignite.internal.sql.engine.prepare.IgniteConvertletTable;
 import org.apache.ignite.internal.sql.engine.prepare.IgniteTypeCoercion;
 import org.apache.ignite.internal.sql.engine.prepare.PlanningContext;
+import org.apache.ignite.internal.sql.engine.property.SqlProperties;
 import org.apache.ignite.internal.sql.engine.rel.IgniteProject;
 import 
org.apache.ignite.internal.sql.engine.rel.logical.IgniteLogicalTableScan;
 import org.apache.ignite.internal.sql.engine.sql.IgniteSqlCommitTransaction;
@@ -896,4 +899,11 @@ public final class Commons {
 
         return actualInputs;
     }
+
+    /** Returns {@code true} if the specified properties allow multi-statement 
query execution. */
+    public static boolean isMultiStatementQueryAllowed(SqlProperties 
properties) {
+        Set<SqlQueryType> allowedTypes = properties.get(ALLOWED_QUERY_TYPES);
+
+        return allowedTypes.contains(SqlQueryType.TX_CONTROL);
+    }
 }
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/api/IgniteSqlImplTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/api/IgniteSqlImplTest.java
index 9ca4c41d56..9f870c940b 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/api/IgniteSqlImplTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/api/IgniteSqlImplTest.java
@@ -96,7 +96,7 @@ class IgniteSqlImplTest extends BaseIgniteAbstractTest {
         when(result.onClose())
                 .thenReturn(closeFuture);
 
-        when(queryProcessor.querySingleAsync(any(), any(), any(), any(), 
any(Object[].class)))
+        when(queryProcessor.queryAsync(any(), any(), any(), any(), 
any(Object[].class)))
                 .thenReturn(completedFuture(result));
 
         AsyncResultSet<?> rs = await(igniteSql.executeAsync(null, "SELECT 1"));
@@ -119,7 +119,7 @@ class IgniteSqlImplTest extends BaseIgniteAbstractTest {
         when(result.onClose()).thenReturn(new CompletableFuture<>());
         when(result.closeAsync()).thenReturn(nullCompletedFuture());
 
-        when(queryProcessor.querySingleAsync(any(), any(), any(), any(), 
any(Object[].class)))
+        when(queryProcessor.queryAsync(any(), any(), any(), any(), 
any(Object[].class)))
                 .thenReturn(completedFuture(result));
 
         AsyncResultSet<?> rs = await(igniteSql.executeAsync(null, "SELECT 1"));
@@ -137,7 +137,7 @@ class IgniteSqlImplTest extends BaseIgniteAbstractTest {
     void resultSetIsNotCreatedIfComponentIsStoppedInMiddleOfOperation() throws 
Exception {
         CompletableFuture<AsyncSqlCursor<InternalSqlRow>> cursorFuture = new 
CompletableFuture<>();
         CountDownLatch executeQueryLatch = new CountDownLatch(1);
-        when(queryProcessor.querySingleAsync(any(), any(), any(), any(), 
any(Object[].class)))
+        when(queryProcessor.queryAsync(any(), any(), any(), any(), 
any(Object[].class)))
                 .thenAnswer(ignored -> {
                     executeQueryLatch.countDown();
                     return cursorFuture;
@@ -173,7 +173,7 @@ class IgniteSqlImplTest extends BaseIgniteAbstractTest {
 
         CompletableFuture<AsyncSqlCursor<InternalSqlRow>> cursorFuture = new 
CompletableFuture<>();
         CountDownLatch executeQueryLatch = new CountDownLatch(3);
-        when(queryProcessor.querySingleAsync(any(), any(), any(), any(), 
any(Object[].class)))
+        when(queryProcessor.queryAsync(any(), any(), any(), any(), 
any(Object[].class)))
                 .thenAnswer(ignored -> {
                     executeQueryLatch.countDown();
 
@@ -204,7 +204,7 @@ class IgniteSqlImplTest extends BaseIgniteAbstractTest {
                 () -> await(result)
         );
         assertThat(igniteSql.openedCursors(), empty());
-        verify(queryProcessor, times(3)).querySingleAsync(any(), any(), any(), 
any(), any(Object[].class));
+        verify(queryProcessor, times(3)).queryAsync(any(), any(), any(), 
any(), any(Object[].class));
         verify(cursor).closeAsync();
     }
 
@@ -230,7 +230,7 @@ class IgniteSqlImplTest extends BaseIgniteAbstractTest {
         when(result.onClose())
                 .thenReturn(closeFuture);
 
-        when(queryProcessor.querySingleAsync(any(), any(), any(), any(), 
any(Object[].class)))
+        when(queryProcessor.queryAsync(any(), any(), any(), any(), 
any(Object[].class)))
                 .thenReturn(completedFuture(result));
 
         AsyncResultSet<?> rs = await(igniteSql.executeAsync(null, "SELECT 1"));
@@ -262,7 +262,7 @@ class IgniteSqlImplTest extends BaseIgniteAbstractTest {
         when(cursor2.hasNextResult()).thenReturn(false);
         when(cursor2.closeAsync()).thenReturn(nullCompletedFuture());
 
-        when(queryProcessor.queryScriptAsync(any(), any(), any(), any(), 
any(Object[].class)))
+        when(queryProcessor.queryAsync(any(), any(), any(), any(), 
any(Object[].class)))
                 .thenReturn(completedFuture(cursor1));
 
         Void rs = await(igniteSql.executeScriptAsync("SELECT 1; SELECT 2"));
@@ -279,7 +279,7 @@ class IgniteSqlImplTest extends BaseIgniteAbstractTest {
         
when(cursor1.nextResult()).thenReturn(CompletableFuture.failedFuture(new 
RuntimeException("Broken")));
         when(cursor1.closeAsync()).thenReturn(nullCompletedFuture());
 
-        when(queryProcessor.queryScriptAsync(any(), any(), any(), any(), 
any(Object[].class)))
+        when(queryProcessor.queryAsync(any(), any(), any(), any(), 
any(Object[].class)))
                 .thenReturn(completedFuture(cursor1));
 
         assertThrowsSqlException(
@@ -308,7 +308,7 @@ class IgniteSqlImplTest extends BaseIgniteAbstractTest {
         
when(cursor2.nextResult()).thenReturn(CompletableFuture.failedFuture(lastCursorScriptException));
         
when(cursor2.closeAsync()).thenReturn(CompletableFuture.failedFuture(cursorCloseException2));
 
-        when(queryProcessor.queryScriptAsync(any(), any(), any(), any(), 
any(Object[].class)))
+        when(queryProcessor.queryAsync(any(), any(), any(), any(), 
any(Object[].class)))
                 .thenReturn(completedFuture(cursor1));
 
         SqlException sqlEx = assertThrowsExactly(SqlException.class, () -> 
await(igniteSql.executeScriptAsync("SELECT 1; SELECT 2")));
@@ -334,7 +334,7 @@ class IgniteSqlImplTest extends BaseIgniteAbstractTest {
 
         when(cursor2.closeAsync()).thenReturn(nullCompletedFuture());
 
-        when(queryProcessor.queryScriptAsync(any(), any(), any(), any(), 
any(Object[].class)))
+        when(queryProcessor.queryAsync(any(), any(), any(), any(), 
any(Object[].class)))
                 .thenReturn(completedFuture(cursor1));
 
         Thread thread = new Thread(() -> {
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/TransactionEnlistTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/TransactionEnlistTest.java
index 333dcf75cd..4f905347e8 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/TransactionEnlistTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/TransactionEnlistTest.java
@@ -132,7 +132,7 @@ public class TransactionEnlistTest extends 
BaseIgniteAbstractTest {
         }
 
         @Override
-        public CompletableFuture<AsyncSqlCursor<InternalSqlRow>> 
querySingleAsync(
+        public CompletableFuture<AsyncSqlCursor<InternalSqlRow>> queryAsync(
                 SqlProperties properties,
                 IgniteTransactions transactions,
                 @Nullable InternalTransaction transaction,
@@ -161,17 +161,6 @@ public class TransactionEnlistTest extends 
BaseIgniteAbstractTest {
             return CompletableFuture.completedFuture(sqlCursor);
         }
 
-        @Override
-        public CompletableFuture<AsyncSqlCursor<InternalSqlRow>> 
queryScriptAsync(
-                SqlProperties properties,
-                IgniteTransactions transactions,
-                @Nullable InternalTransaction transaction,
-                String qry,
-                Object... params
-        ) {
-            throw new UnsupportedOperationException();
-        }
-
         @Override
         public CompletableFuture<Void> start() {
             // NO-OP
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/util/QueryCheckerTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/util/QueryCheckerTest.java
index 7b1db8f720..330a568f4f 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/util/QueryCheckerTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/util/QueryCheckerTest.java
@@ -316,7 +316,7 @@ public class QueryCheckerTest extends 
BaseIgniteAbstractTest {
         }
 
         @Override
-        public CompletableFuture<AsyncSqlCursor<InternalSqlRow>> 
querySingleAsync(
+        public CompletableFuture<AsyncSqlCursor<InternalSqlRow>> queryAsync(
                 SqlProperties properties,
                 IgniteTransactions transactions,
                 @Nullable InternalTransaction transaction,
@@ -345,17 +345,6 @@ public class QueryCheckerTest extends 
BaseIgniteAbstractTest {
             return CompletableFuture.completedFuture(sqlCursor);
         }
 
-        @Override
-        public CompletableFuture<AsyncSqlCursor<InternalSqlRow>> 
queryScriptAsync(
-                SqlProperties properties,
-                IgniteTransactions transactions,
-                @Nullable InternalTransaction transaction,
-                String qry,
-                Object... params
-        ) {
-            throw new UnsupportedOperationException();
-        }
-
         @Override
         public CompletableFuture<Void> start() {
             // NO-OP
diff --git 
a/modules/sql-engine/src/testFixtures/java/org/apache/ignite/internal/sql/engine/util/QueryCheckerImpl.java
 
b/modules/sql-engine/src/testFixtures/java/org/apache/ignite/internal/sql/engine/util/QueryCheckerImpl.java
index f2c433ffb2..87c6de17a5 100644
--- 
a/modules/sql-engine/src/testFixtures/java/org/apache/ignite/internal/sql/engine/util/QueryCheckerImpl.java
+++ 
b/modules/sql-engine/src/testFixtures/java/org/apache/ignite/internal/sql/engine/util/QueryCheckerImpl.java
@@ -306,7 +306,7 @@ abstract class QueryCheckerImpl implements QueryChecker {
         LOG.info("Executing query: [nodeName={}, query={}]", nodeName(), qry);
 
         if (!CollectionUtils.nullOrEmpty(planMatchers)) {
-            CompletableFuture<AsyncSqlCursor<InternalSqlRow>> explainCursors = 
qryProc.querySingleAsync(
+            CompletableFuture<AsyncSqlCursor<InternalSqlRow>> explainCursors = 
qryProc.queryAsync(
                     properties, transactions(), tx, "EXPLAIN PLAN FOR " + qry, 
params);
             AsyncSqlCursor<InternalSqlRow> explainCursor = 
await(explainCursors);
             List<InternalSqlRow> explainRes = getAllFromCursor(explainCursor);
@@ -333,7 +333,7 @@ abstract class QueryCheckerImpl implements QueryChecker {
 
         // Check result.
         CompletableFuture<AsyncSqlCursor<InternalSqlRow>> cursors =
-                qryProc.querySingleAsync(properties, transactions(), tx, qry, 
params);
+                qryProc.queryAsync(properties, transactions(), tx, qry, 
params);
 
         AsyncSqlCursor<InternalSqlRow> cur = await(cursors);
 


Reply via email to