You seem to be operating under some rather bizarre constraints that I don’t fully understand. I would use done column aliases so that columns of different types have different names. I would also introduce some casts.
Can you give a query that reproduces the problem outside of your environment? It’s difficult for us to help otherwise. If this is a problem with Druid, did you try asking on the Druid list? Julian > On Jul 11, 2025, at 01:28, jefn <546143...@qq.com.invalid> wrote: > > Hello, all Contributors to apache calcite: > I am facing a throny issue on calcite-1.38.0, when use the sql following: > > ```sql``` > Select string_10_fun > from ( > select string_10_fun > from ( > select string_10_fun > from ( > select string_10_fun > from ( > select char_length(string_10) as string_10_fun > from table > order by double_01 > ) > ) > order by string_10_fun > ) > order by string_10_fun > ) > order by string_10_fun > ``` > > At this point, the query executed to Druid generates a result, which > column name is string_10_fun, is valued type DruidType.Long, However, in the > method where the physical plan is generated, the sort function’s parameter > string_10, as the same name as char_length(string_10), is defined as an > integer type ( which definition is in > core/org/apache/calcite/sql/fun/SqlStdOperatorTable.java). Since Java does > not allow automatic conversion from a higher precision type long to a lower > type integer, the result returned by Druid(type long) cannot be used as a > valid parameter to sort and causing an error. > To fix this question, I tried to change the > SqlStdOperatorTable.char_length to ReturnTypes.BIGINT_NULLABLE, but it will > cause a series of new question, such as function lpad and function road. Both > of them are supported to use Type integer as the second parameter but not > long. If the result of char_length need to be used as lpad or rpad. It will > also causing errors. > > I was wonder that if there are any solution could help solving this thorny > issue. > > Thanks for your reading!