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