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

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

commit 372346f3981cd90d28181376c3da4a1dafeb7e78
Author: xiejiajun <[email protected]>
AuthorDate: Sun Apr 30 14:09:49 2023 +0800

    [CALCITE-5547] JOIN USING returns incorrect column names
    
    Close apache/calcite#3183
---
 .../calcite/sql/validate/SqlValidatorImpl.java     | 21 ++++++-
 .../org/apache/calcite/test/SqlValidatorTest.java  | 36 +++++++++++
 core/src/test/resources/sql/join.iq                | 71 ++++++++++++++++++++++
 3 files changed, 127 insertions(+), 1 deletion(-)

diff --git 
a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java 
b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
index b53b8c8023..81ce2d7178 100644
--- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
+++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
@@ -696,7 +696,10 @@ public class SqlValidatorImpl implements 
SqlValidatorWithHints {
         SqlNode from =
             requireNonNull(scope.getNode().getFrom(),
                 () -> "getFrom for " + scope.getNode());
-        new Permute(from, 0).permute(selectItems, fields);
+        // If some fields before star identifier,
+        // we should move offset.
+        int offset = calculatePermuteOffset(selectItems);
+        new Permute(from, offset).permute(selectItems, fields);
       }
       return true;
 
@@ -744,6 +747,18 @@ public class SqlValidatorImpl implements 
SqlValidatorWithHints {
     }
   }
 
+  private int calculatePermuteOffset(List<SqlNode> selectItems) {
+    for (int i = 0; i < selectItems.size(); i++) {
+      SqlNode selectItem = selectItems.get(i);
+      SqlNode col = SqlUtil.stripAs(selectItem);
+      if (col.getKind() == SqlKind.IDENTIFIER
+          && selectItem.getKind() != SqlKind.AS) {
+        return i;
+      }
+    }
+    return 0;
+  }
+
   private SqlNode maybeCast(SqlNode node, RelDataType currentType,
       RelDataType desiredType) {
     return SqlTypeUtil.equalSansNullability(typeFactory, currentType, 
desiredType)
@@ -7307,8 +7322,10 @@ public class SqlValidatorImpl implements 
SqlValidatorWithHints {
     final List<ImmutableIntList> sources;
     final RelDataType rowType;
     final boolean trivial;
+    final int offset;
 
     Permute(SqlNode from, int offset) {
+      this.offset = offset;
       switch (from.getKind()) {
       case JOIN:
         final SqlJoin join = (SqlJoin) from;
@@ -7383,9 +7400,11 @@ public class SqlValidatorImpl implements 
SqlValidatorWithHints {
 
       final List<SqlNode> oldSelectItems = ImmutableList.copyOf(selectItems);
       selectItems.clear();
+      selectItems.addAll(oldSelectItems.subList(0, offset));
       final List<Map.Entry<String, RelDataType>> oldFields =
           ImmutableList.copyOf(fields);
       fields.clear();
+      fields.addAll(oldFields.subList(0, offset));
       for (ImmutableIntList source : sources) {
         final int p0 = source.get(0);
         Map.Entry<String, RelDataType> field = oldFields.get(p0);
diff --git a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java 
b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
index f0f7395e7b..2ec6d059f8 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
@@ -4566,6 +4566,42 @@ public class SqlValidatorTest extends 
SqlValidatorTestCase {
             + "clause\\) following CROSS JOIN");
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-5547";>[CALCITE-5547]
+   * Join using returns incorrect column names</a>. */
+  @Test void testExtraColJoinUsing() {
+    final String expectedType = "RecordType(INTEGER NOT NULL TWO, "
+        + "INTEGER NOT NULL DEPTNO, "
+        + "INTEGER NOT NULL EMPNO, "
+        + "VARCHAR(20) NOT NULL ENAME, "
+        + "VARCHAR(10) NOT NULL JOB, "
+        + "INTEGER MGR, "
+        + "TIMESTAMP(0) NOT NULL HIREDATE, "
+        + "INTEGER NOT NULL SAL, "
+        + "INTEGER NOT NULL COMM, "
+        + "BOOLEAN NOT NULL SLACKER, "
+        + "VARCHAR(10) NOT NULL NAME) NOT NULL";
+
+    sql("select 2 as two, * from emp inner join dept using(deptno)")
+        .type(expectedType);
+
+    sql("select 2 as two, * from emp natural join dept")
+        .type(expectedType);
+
+    sql("select *, 2 as two from emp natural join dept")
+        .type("RecordType(INTEGER NOT NULL DEPTNO, "
+            + "INTEGER NOT NULL EMPNO, "
+            + "VARCHAR(20) NOT NULL ENAME, "
+            + "VARCHAR(10) NOT NULL JOB, "
+            + "INTEGER MGR, "
+            + "TIMESTAMP(0) NOT NULL HIREDATE, "
+            + "INTEGER NOT NULL SAL, "
+            + "INTEGER NOT NULL COMM, "
+            + "BOOLEAN NOT NULL SLACKER, "
+            + "VARCHAR(10) NOT NULL NAME, "
+            + "INTEGER NOT NULL TWO) NOT NULL");
+  }
+
   @Test void testJoinUsing() {
     final String empDeptType = "RecordType(INTEGER NOT NULL DEPTNO,"
         + " INTEGER NOT NULL EMPNO,"
diff --git a/core/src/test/resources/sql/join.iq 
b/core/src/test/resources/sql/join.iq
index e68b26c30c..8ab534b477 100644
--- a/core/src/test/resources/sql/join.iq
+++ b/core/src/test/resources/sql/join.iq
@@ -566,4 +566,75 @@ EnumerableCalc(expr#0..10=[{inputs}], 
expr#11=[COALESCE($t7, $t8)], DEPTNO=[$t11
       EnumerableTableScan(table=[[scott, DEPT]])
 !plan
 
+
+### [CALCITE-5547] Join using returns incorrect column names
+select 2 as two, * from emp natural join dept;
++-----+--------+-------+--------+-----------+------+------------+---------+---------+------------+----------+
+| TWO | DEPTNO | EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | 
COMM    | DNAME      | LOC      |
++-----+--------+-------+--------+-----------+------+------------+---------+---------+------------+----------+
+|   2 |     10 |  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    
     | ACCOUNTING | NEW YORK |
+|   2 |     10 |  7839 | KING   | PRESIDENT |      | 1981-11-17 | 5000.00 |    
     | ACCOUNTING | NEW YORK |
+|   2 |     10 |  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    
     | ACCOUNTING | NEW YORK |
+|   2 |     20 |  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    
     | RESEARCH   | DALLAS   |
+|   2 |     20 |  7566 | JONES  | MANAGER   | 7839 | 1981-02-04 | 2975.00 |    
     | RESEARCH   | DALLAS   |
+|   2 |     20 |  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    
     | RESEARCH   | DALLAS   |
+|   2 |     20 |  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    
     | RESEARCH   | DALLAS   |
+|   2 |     20 |  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    
     | RESEARCH   | DALLAS   |
+|   2 |     30 |  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  
300.00 | SALES      | CHICAGO  |
+|   2 |     30 |  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  
500.00 | SALES      | CHICAGO  |
+|   2 |     30 |  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 
1400.00 | SALES      | CHICAGO  |
+|   2 |     30 |  7698 | BLAKE  | MANAGER   | 7839 | 1981-01-05 | 2850.00 |    
     | SALES      | CHICAGO  |
+|   2 |     30 |  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    
0.00 | SALES      | CHICAGO  |
+|   2 |     30 |  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    
     | SALES      | CHICAGO  |
++-----+--------+-------+--------+-----------+------+------------+---------+---------+------------+----------+
+(14 rows)
+
+!ok
+
+select SAL * 12 AS YEAR_SAL, * from emp inner join dept using(deptno);
++----------+--------+-------+--------+-----------+------+------------+---------+---------+------------+----------+
+| YEAR_SAL | DEPTNO | EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     
| COMM    | DNAME      | LOC      |
++----------+--------+-------+--------+-----------+------+------------+---------+---------+------------+----------+
+| 11400.00 |     30 |  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 
|         | SALES      | CHICAGO  |
+| 13200.00 |     20 |  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 
|         | RESEARCH   | DALLAS   |
+| 15000.00 |     30 |  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 
|  500.00 | SALES      | CHICAGO  |
+| 15000.00 |     30 |  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 
| 1400.00 | SALES      | CHICAGO  |
+| 15600.00 |     10 |  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 
|         | ACCOUNTING | NEW YORK |
+| 18000.00 |     30 |  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 
|    0.00 | SALES      | CHICAGO  |
+| 19200.00 |     30 |  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 
|  300.00 | SALES      | CHICAGO  |
+| 29400.00 |     10 |  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 
|         | ACCOUNTING | NEW YORK |
+| 34200.00 |     30 |  7698 | BLAKE  | MANAGER   | 7839 | 1981-01-05 | 2850.00 
|         | SALES      | CHICAGO  |
+| 35700.00 |     20 |  7566 | JONES  | MANAGER   | 7839 | 1981-02-04 | 2975.00 
|         | RESEARCH   | DALLAS   |
+| 36000.00 |     20 |  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 
|         | RESEARCH   | DALLAS   |
+| 36000.00 |     20 |  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 
|         | RESEARCH   | DALLAS   |
+| 60000.00 |     10 |  7839 | KING   | PRESIDENT |      | 1981-11-17 | 5000.00 
|         | ACCOUNTING | NEW YORK |
+|  9600.00 |     20 |  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 
|         | RESEARCH   | DALLAS   |
++----------+--------+-------+--------+-----------+------+------------+---------+---------+------------+----------+
+(14 rows)
+
+!ok
+
+select empno as two, * from emp natural join dept;
++------+--------+-------+--------+-----------+------+------------+---------+---------+------------+----------+
+| TWO  | DEPTNO | EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | 
COMM    | DNAME      | LOC      |
++------+--------+-------+--------+-----------+------+------------+---------+---------+------------+----------+
+| 7369 |     20 |  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |   
      | RESEARCH   | DALLAS   |
+| 7499 |     30 |  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  
300.00 | SALES      | CHICAGO  |
+| 7521 |     30 |  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  
500.00 | SALES      | CHICAGO  |
+| 7566 |     20 |  7566 | JONES  | MANAGER   | 7839 | 1981-02-04 | 2975.00 |   
      | RESEARCH   | DALLAS   |
+| 7654 |     30 |  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 
1400.00 | SALES      | CHICAGO  |
+| 7698 |     30 |  7698 | BLAKE  | MANAGER   | 7839 | 1981-01-05 | 2850.00 |   
      | SALES      | CHICAGO  |
+| 7782 |     10 |  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |   
      | ACCOUNTING | NEW YORK |
+| 7788 |     20 |  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |   
      | RESEARCH   | DALLAS   |
+| 7839 |     10 |  7839 | KING   | PRESIDENT |      | 1981-11-17 | 5000.00 |   
      | ACCOUNTING | NEW YORK |
+| 7844 |     30 |  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |   
 0.00 | SALES      | CHICAGO  |
+| 7876 |     20 |  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |   
      | RESEARCH   | DALLAS   |
+| 7900 |     30 |  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |   
      | SALES      | CHICAGO  |
+| 7902 |     20 |  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |   
      | RESEARCH   | DALLAS   |
+| 7934 |     10 |  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |   
      | ACCOUNTING | NEW YORK |
++------+--------+-------+--------+-----------+------+------------+---------+---------+------------+----------+
+(14 rows)
+
+!ok
+
 # End join.iq

Reply via email to