Skip to content

Commit

Permalink
executor: fill correlated column value in late materialization filter…
Browse files Browse the repository at this point in the history
… conditions (pingcap#49244) (pingcap#49431)

close pingcap#49241
  • Loading branch information
ti-chi-bot authored Dec 14, 2023
1 parent e091ee5 commit e146eda
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 18 deletions.
19 changes: 12 additions & 7 deletions executor/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -3103,13 +3103,18 @@ func constructDAGReq(ctx sessionctx.Context, plans []plannercore.PhysicalPlan, s

func (b *executorBuilder) corColInDistPlan(plans []plannercore.PhysicalPlan) bool {
for _, p := range plans {
x, ok := p.(*plannercore.PhysicalSelection)
if !ok {
continue
}
for _, cond := range x.Conditions {
if len(expression.ExtractCorColumns(cond)) > 0 {
return true
switch x := p.(type) {
case *plannercore.PhysicalSelection:
for _, cond := range x.Conditions {
if len(expression.ExtractCorColumns(cond)) > 0 {
return true
}
}
case *plannercore.PhysicalTableScan:
for _, cond := range x.LateMaterializationFilterCondition {
if len(expression.ExtractCorColumns(cond)) > 0 {
return true
}
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion executor/table_reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,8 @@ type TableReaderExecutor struct {
byItems []*util.ByItems
paging bool
storeType kv.StoreType
// corColInFilter tells whether there's correlated column in filter.
// corColInFilter tells whether there's correlated column in filter (both conditions in PhysicalSelection and LateMaterializationFilterCondition in PhysicalTableScan)
// If true, we will need to revise the dagPB (fill correlated column value in filter) each time call Open().
corColInFilter bool
// corColInAccess tells whether there's correlated column in access conditions.
corColInAccess bool
Expand Down Expand Up @@ -154,6 +155,7 @@ func (e *TableReaderExecutor) Open(ctx context.Context) error {

var err error
if e.corColInFilter {
// If there's correlated column in filter, need to rewrite dagPB
if e.storeType == kv.TiFlash {
execs, err := constructDistExecForTiFlash(e.ctx, e.tablePlan)
if err != nil {
Expand Down
6 changes: 3 additions & 3 deletions planner/core/explain.go
Original file line number Diff line number Diff line change
Expand Up @@ -216,11 +216,11 @@ func (p *PhysicalTableScan) OperatorInfo(normalized bool) string {
}
if p.ctx.GetSessionVars().EnableLateMaterialization && len(p.filterCondition) > 0 && p.StoreType == kv.TiFlash {
buffer.WriteString("pushed down filter:")
if len(p.lateMaterializationFilterCondition) > 0 {
if len(p.LateMaterializationFilterCondition) > 0 {
if normalized {
buffer.Write(expression.SortedExplainNormalizedExpressionList(p.lateMaterializationFilterCondition))
buffer.Write(expression.SortedExplainNormalizedExpressionList(p.LateMaterializationFilterCondition))
} else {
buffer.Write(expression.SortedExplainExpressionList(p.lateMaterializationFilterCondition))
buffer.Write(expression.SortedExplainExpressionList(p.LateMaterializationFilterCondition))
}
} else {
buffer.WriteString("empty")
Expand Down
4 changes: 2 additions & 2 deletions planner/core/physical_plans.go
Original file line number Diff line number Diff line change
Expand Up @@ -808,10 +808,10 @@ type PhysicalTableScan struct {
// AccessCondition is used to calculate range.
AccessCondition []expression.Expression
filterCondition []expression.Expression
// lateMaterializationFilterCondition is used to record the filter conditions
// LateMaterializationFilterCondition is used to record the filter conditions
// that are pushed down to table scan from selection by late materialization.
// TODO: remove this field after we support pushing down selection to coprocessor.
lateMaterializationFilterCondition []expression.Expression
LateMaterializationFilterCondition []expression.Expression

Table *model.TableInfo
Columns []*model.ColumnInfo
Expand Down
8 changes: 4 additions & 4 deletions planner/core/plan_to_pb.go
Original file line number Diff line number Diff line change
Expand Up @@ -228,10 +228,10 @@ func (p *PhysicalTableScan) ToPB(ctx sessionctx.Context, storeType kv.StoreType)
tsExec.KeepOrder = &keepOrder
tsExec.IsFastScan = &(ctx.GetSessionVars().TiFlashFastScan)

if len(p.lateMaterializationFilterCondition) > 0 {
if len(p.LateMaterializationFilterCondition) > 0 {
sc := ctx.GetSessionVars().StmtCtx
client := ctx.GetClient()
conditions, err := expression.ExpressionsToPBList(sc, p.lateMaterializationFilterCondition, client)
conditions, err := expression.ExpressionsToPBList(sc, p.LateMaterializationFilterCondition, client)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -261,10 +261,10 @@ func (p *PhysicalTableScan) partitionTableScanToPBForFlash(ctx sessionctx.Contex
telemetry.CurrentTiflashTableScanWithFastScanCount.Inc()
}

if len(p.lateMaterializationFilterCondition) > 0 {
if len(p.LateMaterializationFilterCondition) > 0 {
sc := ctx.GetSessionVars().StmtCtx
client := ctx.GetClient()
conditions, err := expression.ExpressionsToPBList(sc, p.lateMaterializationFilterCondition, client)
conditions, err := expression.ExpressionsToPBList(sc, p.LateMaterializationFilterCondition, client)
if err != nil {
return nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion planner/core/tiflash_selection_late_materialization.go
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ func predicatePushDownToTableScanImpl(sctx sessionctx.Context, physicalSelection
// remove the pushed down conditions from selection
removeSpecificExprsFromSelection(physicalSelection, selectedConds)
// add the pushed down conditions to table scan
physicalTableScan.lateMaterializationFilterCondition = selectedConds
physicalTableScan.LateMaterializationFilterCondition = selectedConds
// Update the row count of table scan after pushing down the conditions.
physicalTableScan.stats.RowCount *= selectedSelectivity
}

0 comments on commit e146eda

Please sign in to comment.