Skip to content

Commit 40e9099

Browse files
snuyanzinasolimando
authored andcommitted
[CALCITE-7027] Improve error message in case of several UNION, INTERSECT, EXCEPT in a query
1 parent 00e09ac commit 40e9099

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

core/src/main/java/org/apache/calcite/sql/SqlUtil.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -835,6 +835,12 @@ public static SqlNode getSelectListItem(SqlNode query, int i) {
835835
assert row.operandCount() > i : "VALUES has too few columns";
836836
return row.operand(i);
837837

838+
case EXCEPT:
839+
case INTERSECT:
840+
case UNION:
841+
final List<SqlNode> operandList = ((SqlBasicCall) query).getOperandList();
842+
return getSelectListItem(operandList.get(0), i);
843+
838844
default:
839845
// Unexpected type of query.
840846
throw Util.needToImplement(query);

core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5238,6 +5238,35 @@ private ImmutableList<ImmutableBitSet> cube(ImmutableBitSet... sets) {
52385238
.fails("Type mismatch in column 1 of UNION");
52395239

52405240
sql("select ^slacker^ from emp union select name from dept").ok();
5241+
5242+
sql("select ^name^ from dept union select name from dept union select slacker from emp")
5243+
.withTypeCoercion(false)
5244+
.fails("Type mismatch in column 1 of UNION");
5245+
5246+
sql("select ^name^ from dept except select name from dept except select slacker from emp")
5247+
.withTypeCoercion(false)
5248+
.fails("Type mismatch in column 1 of EXCEPT");
5249+
5250+
sql("select ^name^ from dept intersect select name from dept intersect select slacker from emp")
5251+
.withTypeCoercion(false)
5252+
.fails("Type mismatch in column 1 of INTERSECT");
5253+
5254+
sql("select ^name^ from dept minus select name from dept minus select slacker from emp")
5255+
.withTypeCoercion(false)
5256+
.withConformance(SqlConformanceEnum.ORACLE_12) // in order to enable isMinusAllowed()
5257+
.fails("Type mismatch in column 1 of EXCEPT");
5258+
5259+
sql("select name from dept union select name from dept union select ename from emp")
5260+
.withTypeCoercion(false)
5261+
.ok();
5262+
5263+
sql("select name from dept except select name from dept except select ename from emp")
5264+
.withTypeCoercion(false)
5265+
.ok();
5266+
5267+
sql("select name from dept intersect select name from dept intersect select ename from emp")
5268+
.withTypeCoercion(false)
5269+
.ok();
52415270
}
52425271

52435272
@Test void testUnionTypeMismatchWithStarFails() {

0 commit comments

Comments
 (0)