[
https://issues.apache.org/jira/browse/CALCITE-6122?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Steve Carlin reopened CALCITE-6122:
-----------------------------------
Reopening this now that I've had time to investigate further.
I have two unit tests that I added to SqlValidatorTest that showcase the
problem:
{code:java}
@Test void testShouldHaveCast() {
sql("select sum(ename) from emp")
.withValidatorIdentifierExpansion(false)
.rewritesTo("SELECT SUM(`ENAME`)\n"
+ "FROM `EMP`");
}
@Test void testCorrectWithCast() {
sql("select sum(ename) from emp")
.withValidatorIdentifierExpansion(true)
.rewritesTo("SELECT SUM(CAST(`EMP`.`ENAME` AS DECIMAL(19, 9)))\n"
+ "FROM `CATALOG`.`SALES`.`EMP` AS `EMP`");
}
{code}
The "identifierExpansion" config parameter has the side effect of also allowing
type coercion to be sent back with the validated node.
I think I can live with this as a workaround for my code, but it's not great.
I also don't know how easy this will be to fix given that it involves a mutated
selectList parameter in SqlValidatorImpl which gets changed by the
identifierExpansion config param. That code can be found here (in
SqlValidatorImpl.java):
{code:java}
4663 // Create the new select list with expanded items. Pass through
4664 // the original parser position so that any overall failures can
4665 // still reference the original input text.
4666 SqlNodeList newSelectList =
4667 new SqlNodeList(expandedSelectItems,
selectItems.getParserPosition());
4668 if (config.identifierExpansion()) {
4669 select.setSelectList(newSelectList);
4670 }
{code}
> In SqlToRelConverter, AggConverter doesn't use coerced SqlNodes
> ---------------------------------------------------------------
>
> Key: CALCITE-6122
> URL: https://issues.apache.org/jira/browse/CALCITE-6122
> Project: Calcite
> Issue Type: Bug
> Components: core
> Affects Versions: 1.36.0
> Reporter: Steve Carlin
> Priority: Major
>
> I hope I'm describing this right.
> I'm coercing an operand in my handmade OperandTypeChecker. Specifically, I'm
> changing a {color:#de350b}SUM(tinyint_col){color} to a
> {color:#de350b}SUM(CAST(tinyint_col as BIGINT)){color} because my database
> can only handle a bigint operand.
> The eventual logical plan does not keep the CAST operand.
> I had this problem in 1.34.0. I noticed that the code changed quite a bit
> going up to 1.36.0, so I say this to mention that this is not a regression.
> I hacked a fix in my environment, but it's too hacky to commit. To fix the
> problem, I changed to the following code in SqlToRelConverter.convertAgg():
>
> {code:java}
> @@ -3369,7 +3372,11 @@ protected void convertAgg(Blackboard bb, SqlSelect
> select,
> final AggConverter aggConverter =
> AggConverter.create(bb,
> (AggregatingSelectScope) validator().getSelectScope(select));
> - createAggImpl(bb, aggConverter, selectList, groupList, having,
> + selectList.accept(aggConverter);
> + final AggConverter aggConverter2 =
> + AggConverter.create(bb,
> + (AggregatingSelectScope) validator().getSelectScope(select));
> + createAggImpl(bb, aggConverter2, selectList, groupList, having,
> orderExprList);
> }
> {code}
> Note that I had the selectList go through the aggConverter visitor. After
> this, the selectList contains the coerced operands. If the aggConverter is
> created based on this new selectList, it will contain the proper information
> in the aggConverter.convertedInputExprs list
> (One other note: There is an assertion in createAggImpl that i had to disable
> in order to get this hack to work where it checks that bb.agg == null)
> I can probably work on this, but I'm not sure how to create a proper test for
> it, as I've never committed anything to Calcite before.
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)