>From Ali Alsuliman <[email protected]>:

Ali Alsuliman has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/21212?usp=email )


Change subject: [ASTERIXDB-3769][API] Fail async requests for unsupported 
statements
......................................................................

[ASTERIXDB-3769][API] Fail async requests for unsupported statements

- user model changes: yes
- storage format changes: no
- interface changes: no

Ext-ref: MB-71779
Change-Id: Iad2a4ec54b01ca53142852261787e070a781b031
---
M 
asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
M 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-json/async-json.5.update.sqlpp
M 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-json/async-json.6.async.sqlpp
M 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/AsyncDeferredQueries.xml
A 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-not-supported/async-not-supported.1.async.sqlpp
M 
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
M asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
7 files changed, 51 insertions(+), 8 deletions(-)



  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/12/21212/1

diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index ea42a3d..e2833a5 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -386,7 +386,6 @@
         final ResultMetadata outMetadata = requestParameters.getOutMetadata();
         final Map<String, IAObject> stmtParams = 
requestParameters.getStatementParameters();
         warningCollector.setMaxWarnings(sessionConfig.getMaxWarnings());
-        boolean stmtWithAsyncSupportUsed = false;
         try {
             for (Statement stmt : statements) {
                 if (sessionConfig.is(SessionConfig.FORMAT_HTML)) {
@@ -516,7 +515,6 @@
                         }
                         handleCopyToStatement(metadataProvider, stmt, hcc, 
resultSet, resultDelivery, outMetadata,
                                 requestParameters, stmtParams, stats);
-                        stmtWithAsyncSupportUsed = true;
                         break;
                     case INSERT:
                     case UPDATE:
@@ -526,7 +524,6 @@
                             metadataProvider.setResultAsyncMode(resultDelivery 
== ResultDelivery.ASYNC
                                     || resultDelivery == 
ResultDelivery.DEFERRED);
                             metadataProvider.setMaxResultReads(maxResultReads);
-                            stmtWithAsyncSupportUsed = true;
                         }
                         if (stats.getProfileType() == Stats.ProfileType.FULL) {
                             this.jobFlags.add(JobFlag.PROFILE_RUNTIME);
@@ -572,7 +569,6 @@
                         }
                         handleQuery(metadataProvider, (Query) stmt, hcc, 
resultSet, resultDelivery, outMetadata, stats,
                                 requestParameters, stmtParams, stmtRewriter);
-                        stmtWithAsyncSupportUsed = true;
                         break;
                     case ANALYZE:
                         handleAnalyzeStatement(metadataProvider, stmt, hcc, 
requestParameters);
@@ -608,7 +604,7 @@
             throw ex;
         } finally {
             // async queries are completed after their job completes
-            if (statements.isEmpty() || ResultDelivery.ASYNC != resultDelivery 
|| !stmtWithAsyncSupportUsed) {
+            if (statements.isEmpty() || ResultDelivery.ASYNC != 
resultDelivery) {
                 
appCtx.getRequestTracker().complete(requestParameters.getRequestReference().getUuid());
             }
             Thread.currentThread().setName(threadName);
@@ -6013,6 +6009,25 @@
         if (requestDataverseDecl != null) {
             statements.add(0, requestDataverseDecl);
         }
+        validateAsyncSupported(requestParameters);
+    }
+
+    private void validateAsyncSupported(IRequestParameters requestParameters) 
throws CompilationException {
+        if (requestParameters.getResultProperties().getDelivery() == 
ResultDelivery.ASYNC) {
+            Optional<Statement> stmsOpt = 
statements.stream().findAny().filter(this::asyncNotSupported);
+            if (stmsOpt.isPresent()) {
+                Statement stmt = stmsOpt.get();
+                throw new 
CompilationException(ErrorCode.ASYNC_NOT_SUPPORTED_FOR_STATEMENT, 
stmt.getSourceLocation(),
+                        stmt.getKind());
+            }
+        }
+    }
+
+    protected boolean asyncNotSupported(Statement statement) {
+        return switch (statement.getKind()) {
+            case QUERY, COPY_TO, INSERT, UPSERT, UPDATE, DATAVERSE_DECL, SET 
-> false;
+            default -> true;
+        };
     }

     public static void validateStatements(List<Statement> statements, boolean 
allowMultiStatement,
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-json/async-json.5.update.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-json/async-json.5.update.sqlpp
index 31abd48..6adaa2d 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-json/async-json.5.update.sqlpp
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-json/async-json.5.update.sqlpp
@@ -26,3 +26,6 @@
 UPSERT INTO Test { "id": 3, "val": 4.5 };

 UPSERT INTO Test { "id": 4, "val": 5.5 };
+
+// create samples to actually use parallel sort
+ANALYZE DATASET Test;
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-json/async-json.6.async.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-json/async-json.6.async.sqlpp
index 07a41f7..0e123c3 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-json/async-json.6.async.sqlpp
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred-improved/async-json/async-json.6.async.sqlpp
@@ -20,7 +20,4 @@
 -- param include-host=false
 use test;
 SET `compiler.sort.parallel` "true";
-
-// create samples to actually use parallel sort
-analyze dataset Test;
 Select * from Test order by val;
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/AsyncDeferredQueries.xml
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/AsyncDeferredQueries.xml
index f8155ef..276f32d 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/AsyncDeferredQueries.xml
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/AsyncDeferredQueries.xml
@@ -69,6 +69,12 @@
             <output-dir compare="Clean-JSON">async-json</output-dir>
         </compilation-unit>
     </test-case>
+    <test-case FilePath="async-deferred">
+        <compilation-unit name="async-not-supported">
+            <output-dir compare="Clean-JSON">async-not-supported</output-dir>
+            <expected-error>ASX1246: Async mode not supported for the 
statement DATASET_DECL</expected-error>
+        </compilation-unit>
+    </test-case>
     <test-case FilePath="async-deferred-improved">
         <compilation-unit name="async-failed">
             <output-dir compare="Clean-JSON">async-failed</output-dir>
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-not-supported/async-not-supported.1.async.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-not-supported/async-not-supported.1.async.sqlpp
new file mode 100644
index 0000000..31cafaa
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-not-supported/async-not-supported.1.async.sqlpp
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+CREATE COLLECTION col PRIMARY KEY (id: int);
\ No newline at end of file
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
index 9555fd3..0068108 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
@@ -351,6 +351,7 @@
     NOT_ICEBERG_CATALOG(1243),
     UPDATE_PRIMARY_KEY(1244),
     PARQUET_WRITER_ERROR(1245),
+    ASYNC_NOT_SUPPORTED_FOR_STATEMENT(1246),

     // Feed errors
     DATAFLOW_ILLEGAL_STATE(3001),
diff --git 
a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties 
b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
index d7dcff3..20cd871 100644
--- a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
+++ b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
@@ -353,6 +353,7 @@
 1243 = Catalog '%1$s' is not an Iceberg catalog
 1244 = Cannot update primary key '%1$s'
 1245 = Parquet writer error: %1$s
+1246 = Async mode not supported for the statement %1$s

 # Feed Errors
 3001 = Illegal state.

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/21212?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://asterix-gerrit.ics.uci.edu/settings?usp=email

Gerrit-MessageType: newchange
Gerrit-Project: asterixdb
Gerrit-Branch: lumina
Gerrit-Change-Id: Iad2a4ec54b01ca53142852261787e070a781b031
Gerrit-Change-Number: 21212
Gerrit-PatchSet: 1
Gerrit-Owner: Ali Alsuliman <[email protected]>

Reply via email to