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

jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 3215a4f4782 Fix error code when Row appears in query
3215a4f4782 is described below

commit 3215a4f47827a9b838ed585787f9b9c10498edfb
Author: Weihao Li <[email protected]>
AuthorDate: Tue Apr 22 12:16:57 2025 +0800

    Fix error code when Row appears in query
---
 .../it/query/recent/IoTDBTableAggregationIT.java   |  8 ++++++
 .../execution/executor/RegionReadExecutor.java     | 17 +++++++++--
 .../relational/ColumnTransformerBuilder.java       |  2 +-
 .../plan/relational/sql/ast/Expression.java        |  3 ++
 .../queryengine/plan/relational/sql/ast/Row.java   | 33 ++++++++++++++++++++++
 .../relational/sql/ast/TableExpressionType.java    |  3 +-
 6 files changed, 62 insertions(+), 4 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBTableAggregationIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBTableAggregationIT.java
index 8b05080883f..cf6f0217c95 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBTableAggregationIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBTableAggregationIT.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
 import org.apache.iotdb.itbase.category.TableClusterIT;
 import org.apache.iotdb.itbase.category.TableLocalStandaloneIT;
+import org.apache.iotdb.rpc.TSStatusCode;
 
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -5162,5 +5163,12 @@ public class IoTDBTableAggregationIT {
         "select count(distinct *) from table1",
         "mismatched input '*'. Expecting: <expression>",
         DATABASE_NAME);
+
+    String errMsg = TSStatusCode.SEMANTIC_ERROR.getStatusCode() + ": 
Unsupported expression: Row";
+    tableAssertTestFail("select distinct (s1,s2) from table1", errMsg, 
DATABASE_NAME);
+
+    tableAssertTestFail("select (s1,s2) from table1", errMsg, DATABASE_NAME);
+
+    tableAssertTestFail("select * from table1 where (s1,s2) is not null", 
errMsg, DATABASE_NAME);
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/executor/RegionReadExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/executor/RegionReadExecutor.java
index b045babc6d6..e2fb4c95988 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/executor/RegionReadExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/executor/RegionReadExecutor.java
@@ -135,9 +135,22 @@ public class RegionReadExecutor {
       FragmentInstanceInfo info =
           fragmentInstanceManager.execDataQueryFragmentInstance(
               fragmentInstance, VirtualDataRegion.getInstance());
-      return RegionExecutionResult.create(!info.getState().isFailed(), 
info.getMessage(), null);
+      if (info == null) {
+        LOGGER.error(RESPONSE_NULL_ERROR_MSG);
+        return RegionExecutionResult.create(false, RESPONSE_NULL_ERROR_MSG, 
null);
+      } else {
+        RegionExecutionResult resp =
+            RegionExecutionResult.create(!info.getState().isFailed(), 
info.getMessage(), null);
+        info.getErrorCode()
+            .ifPresent(
+                s -> {
+                  resp.setStatus(s);
+                  resp.setReadNeedRetry(StatusUtils.needRetryHelper(s));
+                });
+        return resp;
+      }
     } catch (Throwable t) {
-      LOGGER.error("Execute FragmentInstance in QueryExecutor failed.", t);
+      LOGGER.warn("Execute FragmentInstance in QueryExecutor failed.", t);
       return RegionExecutionResult.create(
           false, String.format(ERROR_MSG_FORMAT, t.getMessage()), null);
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
index badd487b5fe..1b94894bcae 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
@@ -205,7 +205,7 @@ public class ColumnTransformerBuilder
 
   @Override
   public ColumnTransformer visitExpression(Expression expression, Context 
context) {
-    throw new IllegalArgumentException(
+    throw new SemanticException(
         String.format(UNSUPPORTED_EXPRESSION, 
expression.getClass().getSimpleName()));
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/Expression.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/Expression.java
index 87add18c521..53eadfb149c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/Expression.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/Expression.java
@@ -158,6 +158,9 @@ public abstract class Expression extends Node {
       case 28:
         expression = new WhenClause(byteBuffer);
         break;
+      case 31:
+        expression = new Row(byteBuffer);
+        break;
       default:
         throw new IllegalArgumentException("Invalid expression type: " + type);
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/Row.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/Row.java
index e61dbffe95a..d65dbb856b0 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/Row.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/Row.java
@@ -20,7 +20,11 @@
 package org.apache.iotdb.db.queryengine.plan.relational.sql.ast;
 
 import com.google.common.collect.ImmutableList;
+import org.apache.tsfile.utils.ReadWriteIOUtils;
 
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
 import java.util.List;
 import java.util.Objects;
 
@@ -39,6 +43,35 @@ public class Row extends Expression {
     this.items = ImmutableList.copyOf(requireNonNull(items, "items is null"));
   }
 
+  public Row(ByteBuffer byteBuffer) {
+    super(null);
+    int size = ReadWriteIOUtils.readInt(byteBuffer);
+    ImmutableList.Builder<Expression> builder = new ImmutableList.Builder<>();
+    while (size-- > 0) {
+      builder.add(Expression.deserialize(byteBuffer));
+    }
+    this.items = builder.build();
+  }
+
+  protected void serialize(ByteBuffer byteBuffer) {
+    ReadWriteIOUtils.write(items.size(), byteBuffer);
+    for (Expression expression : items) {
+      Expression.serialize(expression, byteBuffer);
+    }
+  }
+
+  protected void serialize(DataOutputStream stream) throws IOException {
+    ReadWriteIOUtils.write(items.size(), stream);
+    for (Expression expression : items) {
+      Expression.serialize(expression, stream);
+    }
+  }
+
+  @Override
+  public TableExpressionType getExpressionType() {
+    return TableExpressionType.ROW;
+  }
+
   public List<Expression> getItems() {
     return items;
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/TableExpressionType.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/TableExpressionType.java
index 1abd6e30c49..78ef4feb09e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/TableExpressionType.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/TableExpressionType.java
@@ -49,7 +49,8 @@ public enum TableExpressionType {
   SEARCHED_CASE((short) 27),
   WHEN_CLAUSE((short) 28),
   CURRENT_DATABASE((short) 29),
-  CURRENT_USER((short) 30);
+  CURRENT_USER((short) 30),
+  ROW((short) 31);
 
   TableExpressionType(short type) {
     this.type = type;

Reply via email to