This is an automated email from the ASF dual-hosted git repository.
caogaofei 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 8473124404d Support constant value in select clause
8473124404d is described below
commit 8473124404d48c3ba9535de763317a065511d3c1
Author: Jackie Tien <[email protected]>
AuthorDate: Wed Aug 14 20:48:14 2024 +0800
Support constant value in select clause
---
.../it/query/recent/IoTDBNullIdQueryIT.java | 24 +++++++++++++++++++++-
.../relational/ColumnTransformerBuilder.java | 20 ++++++++++++++----
.../relational/planner/ir/ExpressionRewriter.java | 9 +++++---
.../planner/ir/ExpressionTreeRewriter.java | 8 ++++++++
4 files changed, 53 insertions(+), 8 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBNullIdQueryIT.java
b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBNullIdQueryIT.java
index 03308917751..19370bb947d 100644
---
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBNullIdQueryIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBNullIdQueryIT.java
@@ -66,7 +66,7 @@ public class IoTDBNullIdQueryIT {
@Test
public void nullFilterTest() throws Exception {
- final String result = defaultFormatDataTime(1) + ",0,false,11.1";
+ String result = defaultFormatDataTime(1) + ",0,false,11.1";
try (final Connection connectionIsNull =
EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
final Statement statement = connectionIsNull.createStatement()) {
@@ -134,6 +134,28 @@ public class IoTDBNullIdQueryIT {
+ resultSet.getString("s3");
assertEquals(result, ans);
assertFalse(resultSet.next());
+
+ // Test constant select item
+ resultSet = statement.executeQuery("select *, 1 from testNullId");
+ result = defaultFormatDataTime(1) + ",null,null,0,false,11.1,1";
+ assertTrue(resultSet.next());
+ ans =
+ resultSet.getString("time")
+ + ","
+ + resultSet.getString("id1")
+ + ","
+ + resultSet.getString("id2")
+ + ","
+ + resultSet.getString("s1")
+ + ","
+ + resultSet.getString("s2")
+ + ","
+ + resultSet.getString("s3")
+ + ","
+ + resultSet.getString("_col6");
+
+ assertEquals(result, ans);
+ assertFalse(resultSet.next());
}
}
}
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 a16994cf35a..e9133b118cc 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
@@ -102,6 +102,7 @@ import org.apache.tsfile.enums.TSDataType;
import org.apache.tsfile.read.common.block.column.BinaryColumn;
import org.apache.tsfile.read.common.block.column.BooleanColumn;
import org.apache.tsfile.read.common.block.column.DoubleColumn;
+import org.apache.tsfile.read.common.block.column.IntColumn;
import org.apache.tsfile.read.common.block.column.LongColumn;
import org.apache.tsfile.read.common.type.Type;
import org.apache.tsfile.utils.Binary;
@@ -119,6 +120,7 @@ import static
org.apache.iotdb.db.queryengine.plan.relational.type.TypeSignature
import static org.apache.tsfile.read.common.type.BlobType.BLOB;
import static org.apache.tsfile.read.common.type.BooleanType.BOOLEAN;
import static org.apache.tsfile.read.common.type.DoubleType.DOUBLE;
+import static org.apache.tsfile.read.common.type.IntType.INT32;
import static org.apache.tsfile.read.common.type.LongType.INT64;
import static org.apache.tsfile.read.common.type.StringType.STRING;
import static org.apache.tsfile.utils.RegexUtils.compileRegex;
@@ -330,10 +332,20 @@ public class ColumnTransformerBuilder
context.cache.computeIfAbsent(
node,
e -> {
- ConstantColumnTransformer columnTransformer =
- new ConstantColumnTransformer(
- INT64,
- new LongColumn(1, Optional.empty(), new long[]
{node.getParsedValue()}));
+ ConstantColumnTransformer columnTransformer;
+ if (node.getParsedValue() >= Integer.MIN_VALUE
+ && node.getParsedValue() <= Integer.MAX_VALUE) {
+ columnTransformer =
+ new ConstantColumnTransformer(
+ INT32,
+ new IntColumn(
+ 1, Optional.empty(), new int[] {(int)
node.getParsedValue()}));
+ } else {
+ columnTransformer =
+ new ConstantColumnTransformer(
+ INT64,
+ new LongColumn(1, Optional.empty(), new long[]
{node.getParsedValue()}));
+ }
context.leafList.add(columnTransformer);
return columnTransformer;
});
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionRewriter.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionRewriter.java
index 13110f43470..23709916eb8 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionRewriter.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionRewriter.java
@@ -35,6 +35,7 @@ import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.InPredicate;
import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.IsNotNullPredicate;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.IsNullPredicate;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LikePredicate;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Literal;
import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LogicalExpression;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.NotExpression;
import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.NullIfExpression;
@@ -48,9 +49,6 @@ public class ExpressionRewriter<C> {
protected Expression rewriteExpression(
Expression node, C context, ExpressionTreeRewriter<C> treeRewriter) {
return null;
- // throw new IllegalStateException(
- // String.format("%s is not supported in ExpressionRewriter yet",
- // node.getClass().getName()));
}
public Expression rewriteFieldReference(
@@ -151,6 +149,11 @@ public class ExpressionRewriter<C> {
return rewriteExpression(node, context, treeRewriter);
}
+ public Expression rewriteLiteral(
+ Literal node, C context, ExpressionTreeRewriter<C> treeRewriter) {
+ return rewriteExpression(node, context, treeRewriter);
+ }
+
public Expression rewriteInPredicate(
InPredicate node, C context, ExpressionTreeRewriter<C> treeRewriter) {
return rewriteExpression(node, context, treeRewriter);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionTreeRewriter.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionTreeRewriter.java
index 7841d65de1b..fa52d38fd47 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionTreeRewriter.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionTreeRewriter.java
@@ -575,6 +575,14 @@ public final class ExpressionTreeRewriter<C> {
@Override
protected Expression visitLiteral(Literal node, Context<C> context) {
+ if (!context.isDefaultRewrite()) {
+ Expression result =
+ rewriter.rewriteLiteral(node, context.get(),
ExpressionTreeRewriter.this);
+ if (result != null) {
+ return result;
+ }
+ }
+
return node;
}
}