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;
