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

Reply via email to