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);