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;