[ https://issues.apache.org/jira/browse/CALCITE-2042?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16244357#comment-16244357 ]
Julian Hyde commented on CALCITE-2042: -------------------------------------- I agree that the SQL should work as written, and the Calcite should add necessary implicit casts. {{SetOp}} and its sub-classes ({{Union}} etc.) allow the input relational expressions to have *somewhat* different types but for each column it has to be able to infer a "least restrictive type" - basically in the same type family - otherwise {{SetOp.deriveRowType()}} will throw (see CALCITE-1522). Which means that there is work to do to make the types identical. I think we should have a new utility method that {{SetOp.ensureHomogeneous()}} that calls {{SetOp.isHomogeneous()}} (an existing method, not currently used, but probably used for a similar purpose in the distant past) and returns either the same {{SetOp}} or one with the necessary casts added. You don't need to override the method in sub-classes; just call {{copy}}. After we have a plan we should call {{ensureHomogeneous}} before generating code. > Compatible types of columns combined via set operators may need explicit > type-casting conversion > ------------------------------------------------------------------------------------------------ > > Key: CALCITE-2042 > URL: https://issues.apache.org/jira/browse/CALCITE-2042 > Project: Calcite > Issue Type: Bug > Reporter: Liao Xintao > Assignee: Julian Hyde > Priority: Minor > > As knowns that columns combined via set operators (such as UNION, EXCEPT and > INTERSECT) need not have exactly the same data type. So the SQL query is > likely as below: > {code:sql} > select sum(bonus) from ( > (select sal as bonus from emp where empno < 100) > UNION ALL > (select sal * 0.5 as bonus from emp where empno >= 100) > ) > {code} > In this case, the data types of two "bonus" column are INTEGER and > DECIMAL(12, 1) respectively, and the UNION operator derives DECIMAL(12, 1) as > return type. The plan seems so good till I run it on Flink. The Flink > UnionOperator validates the data types of two inputs and throws an exception > because the two input types are not exactly the same. > The underling systems based on calcite, like Flink, may adapt themselves to > this kind of plan by modifying some codes. In my opinion, however, it may be > a better way that the plan ensures the rules of data types of results of > aggregation, (maybe) via rewriting the plan or adding explicit type-casting > conversion which has been done when converting <case expression>. > Any feedback or advice is greatly appreciated. > -- This message was sent by Atlassian JIRA (v6.4.14#64029)