func (sq *subquery) EvalRows(ctx context.Context, rowCount int) ([]interface{}, error) { b := newExecutorBuilder(ctx, sq.is) plan.Refine(sq.plan) e := b.build(sq.plan) if b.err != nil { return nil, errors.Trace(b.err) } defer e.Close() if len(e.Fields()) == 0 { // No result fields means no Recordset. for { row, err := e.Next() if err != nil { return nil, errors.Trace(err) } if row == nil { return nil, nil } } } var ( err error row *Row rows = []interface{}{} ) for rowCount != 0 { row, err = e.Next() if err != nil { return rows, errors.Trace(err) } if row == nil { break } if len(row.Data) == 1 { rows = append(rows, row.Data[0].GetValue()) } else { rows = append(rows, types.DatumsToInterfaces(row.Data)) } if rowCount > 0 { rowCount-- } } return rows, nil }
// Next implements Executor Next interface. func (e *DistinctExec) Next() (*Row, error) { if e.checker == nil { e.checker = distinct.CreateDistinctChecker() } for { row, err := e.Src.Next() if err != nil { return nil, errors.Trace(err) } if row == nil { return nil, nil } ok, err := e.checker.Check(types.DatumsToInterfaces(row.Data)) if err != nil { return nil, errors.Trace(err) } if !ok { continue } return row, nil } }