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

amashenkov pushed a commit to branch ignite-25896
in repository https://gitbox.apache.org/repos/asf/ignite-3.git

commit 96f413d92f1e4485eb7f94e359d45127f0387301
Author: amashenkov <[email protected]>
AuthorDate: Wed Jul 23 15:04:54 2025 +0300

    Fix root node projection.
---
 .../apache/ignite/internal/sql/api/ItCommonApiTest.java   | 15 +++++++++++++++
 .../ignite/internal/sql/engine/prepare/PlannerHelper.java | 10 +++-------
 2 files changed, 18 insertions(+), 7 deletions(-)

diff --git 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItCommonApiTest.java
 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItCommonApiTest.java
index ecb8978213a..cfac3650d8c 100644
--- 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItCommonApiTest.java
+++ 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItCommonApiTest.java
@@ -39,6 +39,21 @@ public class ItCommonApiTest extends BaseSqlIntegrationTest {
         return 1;
     }
 
+    @Test
+    void rootProjectionWithDuplicateNames() {
+        String sql = "CREATE TABLE CITY(ID INT PRIMARY KEY, NAME 
VARCHAR(255));\n"
+                + "CREATE TABLE STREET(ID INT PRIMARY KEY, CITY_ID INT, NAME 
VARCHAR(255));\n"
+                + "INSERT INTO CITY(ID, NAME) VALUES(1, 'New York');\n"
+                + "INSERT INTO STREET(ID, CITY_ID, NAME) VALUES(1, 1, 
'Broadway');\n"
+                + "INSERT INTO STREET(ID, CITY_ID, NAME) VALUES(2, 1, 'Wall 
Street');\n";
+
+        sqlScript(sql);
+
+        sql("SELECT CITY_ID, NAME, NAME FROM STREET ORDER BY ID");
+        sql("SELECT * FROM STREET JOIN CITY ON STREET.CITY_ID = CITY.ID ORDER 
BY STREET.ID");
+        sql("SELECT CITY.NAME, STREET.NAME FROM STREET JOIN CITY ON 
STREET.CITY_ID = CITY.ID ORDER BY STREET.ID");
+    }
+
     /** Check timestamp type operations correctness using sql and kv api. */
     @Test
     public void checkTimestampOperations() {
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PlannerHelper.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PlannerHelper.java
index 512522c80ca..1e5a93e237e 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PlannerHelper.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PlannerHelper.java
@@ -48,6 +48,7 @@ import org.apache.calcite.rel.RelShuttleImpl;
 import org.apache.calcite.rel.core.TableScan;
 import org.apache.calcite.rel.logical.LogicalCorrelate;
 import org.apache.calcite.rel.logical.LogicalJoin;
+import org.apache.calcite.rel.logical.LogicalProject;
 import org.apache.calcite.rel.rules.CoreRules;
 import org.apache.calcite.rel.rules.JoinPushThroughJoinRule;
 import org.apache.calcite.rel.rules.MultiJoin;
@@ -209,14 +210,9 @@ public final class PlannerHelper {
             result = planner.transform(PlannerPhase.OPTIMIZATION, desired, 
rel);
 
             if (!root.isRefTrivial()) {
-                List<RexNode> projects = new ArrayList<>();
-                RexBuilder rexBuilder = result.getCluster().getRexBuilder();
+                LogicalProject project = (LogicalProject) root.project();
 
-                for (int field : Pair.left(root.fields)) {
-                    projects.add(rexBuilder.makeInputRef(result, field));
-                }
-
-                result = new IgniteProject(result.getCluster(), desired, 
result, projects, root.validatedRowType);
+                result = new IgniteProject(result.getCluster(), desired, 
result, project.getProjects(), project.getRowType());
             }
 
             return result;

Reply via email to