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() {