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

cancai pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/main by this push:
     new 7f99701eba [CALCITE-7447] RelRoot.project() adds Project for DDL nodes
7f99701eba is described below

commit 7f99701eba269159cac17ae841627d5e1e6ecdf2
Author: Niels Pardon <[email protected]>
AuthorDate: Fri Mar 20 14:57:09 2026 +0100

    [CALCITE-7447] RelRoot.project() adds Project for DDL nodes
    
    Signed-off-by: Niels Pardon <[email protected]>
---
 .../main/java/org/apache/calcite/rel/RelRoot.java  |  5 ++-
 .../java/org/apache/calcite/rel/RelRootTest.java   | 50 ++++++++++++++++++++++
 2 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/core/src/main/java/org/apache/calcite/rel/RelRoot.java 
b/core/src/main/java/org/apache/calcite/rel/RelRoot.java
index 4eb495e70a..7fe6955910 100644
--- a/core/src/main/java/org/apache/calcite/rel/RelRoot.java
+++ b/core/src/main/java/org/apache/calcite/rel/RelRoot.java
@@ -159,10 +159,13 @@ public RelNode project() {
 
   /** Returns the root relational expression as a {@link LogicalProject}.
    *
-   * @param force Create a Project even if all fields are used */
+   * @param force Create a Project even if all fields are used
+   * @return the root relational expression
+   */
   public RelNode project(boolean force) {
     if (isRefTrivial()
         && (SqlKind.DML.contains(kind)
+            || SqlKind.DDL.contains(kind)
             || !force
             || (rel instanceof LogicalProject && isNameTrivial()))) {
       return rel;
diff --git a/core/src/test/java/org/apache/calcite/rel/RelRootTest.java 
b/core/src/test/java/org/apache/calcite/rel/RelRootTest.java
index 9c13336cee..9c195b7f2b 100644
--- a/core/src/test/java/org/apache/calcite/rel/RelRootTest.java
+++ b/core/src/test/java/org/apache/calcite/rel/RelRootTest.java
@@ -16,6 +16,8 @@
  */
 package org.apache.calcite.rel;
 
+import org.apache.calcite.plan.RelOptCluster;
+import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.logical.LogicalProject;
 import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.rel.type.RelDataTypeFieldImpl;
@@ -29,6 +31,8 @@
 import org.apache.calcite.tools.RelBuilder;
 
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
 
 import java.util.Collections;
 import java.util.List;
@@ -119,4 +123,50 @@ public class RelRootTest {
     final RelNode forceProject = root.project(true);
     assertThat(forceProject, equalTo(project));
   }
+
+  static SqlKind[] ddlSqlKinds() {
+    return SqlKind.DDL.toArray(new SqlKind[0]);
+  }
+
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7447";>[CALCITE-7447]
+   * RelRoot.project() adds Project for DDL nodes</a>. */
+  @ParameterizedTest
+  @MethodSource("ddlSqlKinds")
+  void testRelRootProjectDdl(SqlKind ddlKind) {
+    final SchemaPlus rootSchema = Frameworks.createRootSchema(true);
+    final SchemaPlus defaultSchema =
+        CalciteAssert.addSchema(rootSchema, CalciteAssert.SchemaSpec.HR);
+    final FrameworkConfig frameworkConfig = RelBuilderTest.config()
+        .defaultSchema(defaultSchema)
+        .build();
+    final RelBuilder relBuilder = RelBuilder.create(frameworkConfig);
+    final RelNode scanRel = relBuilder.scan("emps")
+        
.project(relBuilder.fields(Collections.singletonList("empid"))).build();
+
+    final RelNode inputRel = new DummyDdlRelNode(relBuilder.getCluster(), 
scanRel);
+
+    final RelRoot root = RelRoot.of(inputRel, ddlKind);
+
+    final RelNode project = root.project();
+    assertThat(project, equalTo(inputRel));
+    assertThat(project, instanceOf(DummyDdlRelNode.class));
+
+    // regular project() and force project() are the same
+    final RelNode forceProject = root.project(true);
+    assertThat(forceProject, equalTo(project));
+  }
+
+  /**
+   * Dummy DDL RelNode for testing.
+   */
+  static class DummyDdlRelNode extends SingleRel {
+    protected DummyDdlRelNode(RelOptCluster cluster, RelNode input) {
+      this(cluster, cluster.traitSet(), input);
+    }
+
+    protected DummyDdlRelNode(RelOptCluster cluster, RelTraitSet traits, 
RelNode input) {
+      super(cluster, traits, input);
+    }
+  }
 }

Reply via email to