func (us *UnionScanExec) buildAndSortAddedRows(t table.Table, asName *model.CIStr) error { us.addedRows = make([]*Row, 0, len(us.dirty.addedRows)) for h, data := range us.dirty.addedRows { for i, field := range us.Src.Fields() { field.Expr.SetDatum(data[i]) } if us.condition != nil { matched, err := evaluator.EvalBool(us.ctx, us.condition) if err != nil { return errors.Trace(err) } if !matched { continue } } rowKeyEntry := &RowKeyEntry{Handle: h, Tbl: t, TableAsName: asName} row := &Row{Data: data, RowKeys: []*RowKeyEntry{rowKeyEntry}} us.addedRows = append(us.addedRows, row) } if us.desc { sort.Sort(sort.Reverse(us)) } else { sort.Sort(us) } if us.sortErr != nil { return errors.Trace(us.sortErr) } return nil }
// Next implements Executor Next interface. // The data in the returned row is not used by caller. func (e *JoinInnerExec) Next() (*Row, error) { if e.done { return nil, nil } rowKeysSlice := make([][]*RowKeyEntry, len(e.InnerPlans)) for { exec := e.innerExecs[e.cursor] if exec == nil { innerPlan := e.InnerPlans[e.cursor] plan.Refine(innerPlan) exec = e.builder.build(innerPlan) if e.builder.err != nil { return nil, errors.Trace(e.builder.err) } e.innerExecs[e.cursor] = exec } row, err := exec.Next() if err != nil { return nil, errors.Trace(err) } if row == nil { exec.Close() e.innerExecs[e.cursor] = nil if e.cursor == 0 { e.done = true return nil, nil } e.cursor-- continue } rowKeysSlice[e.cursor] = row.RowKeys if e.cursor < len(e.innerExecs)-1 { e.cursor++ continue } var match = true if e.Condition != nil { match, err = evaluator.EvalBool(e.ctx, e.Condition) if err != nil { return nil, errors.Trace(err) } } if match { row.RowKeys = joinRowKeys(rowKeysSlice) return row, nil } } }
// Next implements Executor Next interface. func (e *FilterExec) Next() (*Row, error) { for { srcRow, err := e.Src.Next() if err != nil { return nil, errors.Trace(err) } if srcRow == nil { return nil, nil } match, err := evaluator.EvalBool(e.ctx, e.Condition) if err != nil { return nil, errors.Trace(err) } if match { return srcRow, nil } } }