xy720 edited a comment on issue #6462: URL: https://github.com/apache/incubator-doris/issues/6462#issuecomment-926612106
This problem is caused by SortNode incorrectly collecting TupleIsNull predicate of child nodes. explain sql: ``` +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Explain String | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | PLAN FRAGMENT 0 | | OUTPUT EXPRS:<slot 57> <slot 37> `medal_data`.`event_day` | <slot 58> <slot 38> `medal_data`.`medal_level` | <slot 59> <slot 39> multi_distinct_count(DISTINCT `medal_data`.`uid`) | <slot 60> <slot 40> multi_distinct_count(DISTINCT if(`row_rank` = 1, `medal_data`.`uid`, NULL)) | <slot 56> | | PARTITION: HASH_PARTITIONED: <slot 38> `medal_data`.`medal_level` | | | | RESULT SINK | | | | 15:ANALYTIC | | | functions: [, sum(<slot 59> <slot 39> multi_distinct_count(DISTINCT `medal_data`.`uid`)), ] | | | partition by: <slot 38> `medal_data`.`medal_level` | | | order by: <slot 57> <slot 37> `medal_data`.`event_day` ASC NULLS FIRST | | | window: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW | | | | | 14:SORT | | | order by: <slot 58> <slot 38> `medal_data`.`medal_level` ASC, <slot 57> <slot 37> `medal_data`.`event_day` ASC | | | offset: 0 | | | | | 20:EXCHANGE | | | | PLAN FRAGMENT 1 | | OUTPUT EXPRS: | | PARTITION: RANDOM | | | | STREAM DATA SINK | | EXCHANGE ID: 20 | | HASH_PARTITIONED: <slot 38> `medal_data`.`medal_level` | | | | 13:AGGREGATE (update finalize) | | | output: multi_distinct_count(DISTINCT if(TupleIsNull(21,20), NULL, <slot 45> <slot 14> `uid`)), multi_distinct_count(DISTINCT if(if(TupleIsNull(21,20), NULL, <slot 43>) = 1, if(TupleIsNull(21,20), NULL, <slot 45> <slot 14> `uid`), NULL)) | | | group by: `event_day`, <slot 5> `medal_level` | | | cardinality=-1 | | | | | 12:HASH JOIN | | | join op: LEFT OUTER JOIN (BROADCAST) | | | hash predicates: | | | colocate: false, reason: Src column hash been transformed by expr | | | equal join conjunct: if(TupleIsNull(21,20), NULL, <slot 45> <slot 14> `uid`) = <slot 29> `uid` | | | equal join conjunct: `event_day` = <slot 30> `event_day` | | | cardinality=-1 | | | | | |----19:EXCHANGE | | | | | 9:HASH JOIN | | | join op: LEFT OUTER JOIN (BROADCAST) | | | hash predicates: | | | colocate: false, reason: The src data has been redistributed | | | equal join conjunct: `event_day` = <slot 44> <slot 13> `event_day` | | | equal join conjunct: <slot 5> `medal_level` = <slot 46> <slot 15> `medal_level` | | | cardinality=-1 | | | | | |----18:EXCHANGE | | | | | 4:HASH JOIN | | | join op: INNER JOIN (BROADCAST) | | | hash predicates: | | | colocate: false, reason: Src column hash been transformed by expr | | | equal join conjunct: 1 = 1 | | | cardinality=-1 | | | | | |----16:EXCHANGE | | | | | 1:AGGREGATE (update finalize) | | | group by: `event_day` | | | cardinality=-1 | | | | | 0:OlapScanNode | | TABLE: dwd_youjia_medal_new_incr_day | | PREAGGREGATION: ON | | partitions=0/4 | | rollup: null | | tabletRatio=0/0 | | tabletList= | | cardinality=0 | | avgRowSize=16.0 | | numNodes=1 | | | | PLAN FRAGMENT 2 | | OUTPUT EXPRS: | | PARTITION: RANDOM | | | | STREAM DATA SINK | | EXCHANGE ID: 19 | | UNPARTITIONED | | | | 11:AGGREGATE (update finalize) | | | group by: `uid`, `event_day` | | | cardinality=-1 | | | | | 10:OlapScanNode | | TABLE: autocar_youjia_app_ubc_log_new | | PREAGGREGATION: OFF. Reason: conjunct on `uid` which is StorageEngine value column | | partitions=0/2 | | rollup: null | | tabletRatio=0/0 | | tabletList= | | cardinality=0 | | avgRowSize=32.0 | | numNodes=1 | | | | PLAN FRAGMENT 3 | | OUTPUT EXPRS: | | PARTITION: HASH_PARTITIONED: <slot 14> `uid`, <slot 15> `medal_level` | | | | STREAM DATA SINK | | EXCHANGE ID: 18 | | UNPARTITIONED | | | | 8:ANALYTIC | | | functions: [, row_number(), ] | | | partition by: <slot 14> `uid`, <slot 15> `medal_level` | | | order by: <slot 44> <slot 13> `event_day` ASC NULLS FIRST | | | window: ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW | | | | | 7:SORT | | | order by: <slot 45> <slot 14> `uid` ASC, <slot 46> <slot 15> `medal_level` ASC, <slot 44> <slot 13> `event_day` ASC | | | offset: 0 | | | | | 17:EXCHANGE | | | | PLAN FRAGMENT 4 | | OUTPUT EXPRS: | | PARTITION: RANDOM | | | | STREAM DATA SINK | | EXCHANGE ID: 17 | | HASH_PARTITIONED: <slot 14> `uid`, <slot 15> `medal_level` | | | | 6:AGGREGATE (update finalize) | | | group by: `event_day`, `uid`, `medal_level` | | | cardinality=-1 | | | | | 5:OlapScanNode | | TABLE: dwd_youjia_medal_new_incr_day | | PREAGGREGATION: ON | | partitions=0/4 | | rollup: null | | tabletRatio=0/0 | | tabletList= | | cardinality=0 | | avgRowSize=48.0 | | numNodes=1 | | | | PLAN FRAGMENT 5 | | OUTPUT EXPRS: | | PARTITION: RANDOM | | | | STREAM DATA SINK | | EXCHANGE ID: 16 | | UNPARTITIONED | | | | 3:AGGREGATE (update finalize) | | | group by: `medal_level` | | | cardinality=-1 | | | | | 2:OlapScanNode | | TABLE: dwd_youjia_medal_new_incr_day | | PREAGGREGATION: ON | | partitions=0/4 | | rollup: null | | tabletRatio=0/0 | | tabletList= | | cardinality=0 | | avgRowSize=16.0 | | numNodes=1 | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ``` The SortNode(14) has member variable `resolvedTupleExprs`, which collects output exprs from its child node, and will be sent to be. When collecting, it filters exprs not bound to tupleId of its child node through Expr.IsBoundbyTupleIds() method. (See details in AnalyticPlanner.java:createSortInfo()). Sometimes, when there is left join in the query, the child nodes in the tree will produce many TupleIsNull predicates, but we did not implement IsBoundbyTupleIds() method for TupleIsNull predicate. So SortNode will incorrectly collect wrong TupleIsNull, which may cause be core. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org