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

asolimando 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 40e90998ac [CALCITE-7027] Improve error message in case of several 
`UNION`, `INTERSECT`, `EXCEPT` in a query
40e90998ac is described below

commit 40e90998ac111a15838fe6cdb90c54aafa28cee0
Author: Sergey Nuyanzin <[email protected]>
AuthorDate: Sun May 18 23:28:40 2025 +0200

    [CALCITE-7027] Improve error message in case of several `UNION`, 
`INTERSECT`, `EXCEPT` in a query
---
 .../main/java/org/apache/calcite/sql/SqlUtil.java  |  6 +++++
 .../org/apache/calcite/test/SqlValidatorTest.java  | 29 ++++++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/core/src/main/java/org/apache/calcite/sql/SqlUtil.java 
b/core/src/main/java/org/apache/calcite/sql/SqlUtil.java
index 97b095d2f6..107125af5f 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlUtil.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlUtil.java
@@ -835,6 +835,12 @@ public static SqlNode getSelectListItem(SqlNode query, int 
i) {
       assert row.operandCount() > i : "VALUES has too few columns";
       return row.operand(i);
 
+    case EXCEPT:
+    case INTERSECT:
+    case UNION:
+      final List<SqlNode> operandList = ((SqlBasicCall) 
query).getOperandList();
+      return getSelectListItem(operandList.get(0), i);
+
     default:
       // Unexpected type of query.
       throw Util.needToImplement(query);
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 91ed529f62..ccbd447ac7 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
@@ -5238,6 +5238,35 @@ private ImmutableList<ImmutableBitSet> 
cube(ImmutableBitSet... sets) {
         .fails("Type mismatch in column 1 of UNION");
 
     sql("select ^slacker^ from emp union select name from dept").ok();
+
+    sql("select ^name^ from dept union select name from dept union select 
slacker from emp")
+        .withTypeCoercion(false)
+        .fails("Type mismatch in column 1 of UNION");
+
+    sql("select ^name^ from dept except select name from dept except select 
slacker from emp")
+        .withTypeCoercion(false)
+        .fails("Type mismatch in column 1 of EXCEPT");
+
+    sql("select ^name^ from dept intersect select name from dept intersect 
select slacker from emp")
+        .withTypeCoercion(false)
+        .fails("Type mismatch in column 1 of INTERSECT");
+
+    sql("select ^name^ from dept minus select name from dept minus select 
slacker from emp")
+        .withTypeCoercion(false)
+        .withConformance(SqlConformanceEnum.ORACLE_12) // in order to enable 
isMinusAllowed()
+        .fails("Type mismatch in column 1 of EXCEPT");
+
+    sql("select name from dept union select name from dept union select ename 
from emp")
+        .withTypeCoercion(false)
+        .ok();
+
+    sql("select name from dept except select name from dept except select 
ename from emp")
+        .withTypeCoercion(false)
+        .ok();
+
+    sql("select name from dept intersect select name from dept intersect 
select ename from emp")
+        .withTypeCoercion(false)
+        .ok();
   }
 
   @Test void testUnionTypeMismatchWithStarFails() {

Reply via email to