[
https://issues.apache.org/jira/browse/CALCITE-6204?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17807186#comment-17807186
]
Benchao Li commented on CALCITE-6204:
-------------------------------------
[~xuyangzhong] Thanks for reporting this, and the analysis, I agree that this
is a bug. CC [~jingzhang] the original author of this feature.
I guess there is a Flink Jira which is blocked by this, it would be useful if
you add it as a "blocks" link issue.
> When do not expand the plan when SqlToRel, the final plan with
> SET_SEMANTICS_TABLE is wrong
> ----------------------------------------------------------------------------------------------
>
> Key: CALCITE-6204
> URL: https://issues.apache.org/jira/browse/CALCITE-6204
> Project: Calcite
> Issue Type: Bug
> Reporter: xuyang
> Priority: Major
> Attachments: image-2024-01-16-10-12-37-047.png,
> image-2024-01-16-10-14-04-036.png, image-2024-01-16-10-15-20-310.png,
> image-2024-01-16-10-16-54-471.png
>
>
> Modify the test SqlToRelConverterTest#testTableFunctionWithPartitionKey to
> reproduce this bug:
> {code:java}
> @Test void testTableFunctionWithPartitionKey() {
> final String sql = "select *\n"
> + "from table(topn(table orders partition by productid, 3))";
> sql(sql).withConfig(c -> c.withExpand(false)).ok();
> } {code}
> The final plan is like:
> {code:java}
> LogicalProject(ROWTIME=[$0], PRODUCTID=[$1], ORDERID=[$2], RANK_NUMBER=[$3])
> LogicalTableFunctionScan(invocation=[TOPN(3)],
> rowType=[RecordType(TIMESTAMP(0) ROWTIME, INTEGER PRODUCTID, INTEGER ORDERID,
> BIGINT RANK_NUMBER)])
> {code}
> We can see that in the final plan the TableFunctionScan lost the partition
> keys and lost the subquery that contains the original table source `orders`.
> =========================================================
> {color:#de350b}The following is my attempt to find out where the bug lies.
> Some pictures with variables for some key steps are attached to make it
> easier for others to understand.{color}
> When I dug into the code, I found that the problem may be in the following
> steps:
> 1. When not expanding plan, we will retain subquery in
> SqlToRelConverter#convertCollectionTable
> 2. When converting the SqlCall of the "topn" function in
> StandardConvertletTable, the first SET_SEMANTICS_TABLE operand will be
> forcibly ignored, so only the arg "3" in the "topn" function is retained, and
> the original table "order" and partition key are removed. For details, please
> refer to StandardConvertletTable#convertOperands
> 3. After converting the expression with "topn" SqlCall to RexCall, when
> building LogicalTableFunctionScan, we only use the RexCall that does not
> contain the original table "order" and partition key, and the complete
> subquery retained by step 1 is not used..
> The plan for the relevant steps is as follows:
> 1. Subquery retained when bb is not expanded
> !image-2024-01-16-10-12-37-047.png|width=656,height=290!
> 2.1
> SqlCall before entering StandardConvertletTable
> !image-2024-01-16-10-14-04-036.png|width=653,height=183!
> 2.2
> RexCall after StandardConvertletTable processing
> !image-2024-01-16-10-15-20-310.png|width=578,height=146!
> 3. The constructed LogicalTableFunctionScan
> !image-2024-01-16-10-16-54-471.png|width=682,height=262!
>
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)