Hi,在SQL优化的末尾,StreamPhysicalTableSourceScan转化为StreamExecTableSourceScan的过程中[1],会执行一次getScanRuntimeProvider,此时的getScanRuntimeProvider一定是在applyFilters方法之后触发的。




你可以尝试将filterFields记录在JdbcDynamicTableSource 这个类中,如果该值为空,则getScanRuntimeProvider 
时无需拼接(在applyFilters执行之前一定是空的);当该值不为空的时候,在getScanRuntimeProvider 
进行拼接(最后一次physical node转exec node时,一定执行过applyFilters方法)。




[1] 
https://github.com/apache/flink/blob/98997ea37ba08eae0f9aa6dd34823238097d8e0d/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/common/CommonExecTableSourceScan.java#L83




--

    Best!
    Xuyang





在 2022-06-01 20:03:58,"朱育锋" <comeonyf...@163.com> 写道:

Hi,在SQL优化的末尾,StreamPhysicalTableSourceScan转化为StreamExecTableSourceScan的过程中[1],会执行一次getScanRuntimeProvider,此时的getScanRuntimeProvider一定是在applyFilters方法之后触发的。<br/><br/>你可以尝试将filterFields记录在JdbcDynamicTableSource
 这个类中,如果该值为空,则getScanRuntimeProvider 
时无需拼接(在applyFilters执行之前一定是空的);当该值不为空的时候,在getScanRuntimeProvider 
进行拼接(最后一次physical node转exec node时,一定执行过applyFilters方法)。<br/><br/>[1] 
https://github.com/apache/flink/blob/98997ea37ba08eae0f9aa6dd34823238097d8e0d/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/common/CommonExecTableSourceScan.java#L83

回复