func (r *JoinPlan) findMatchedRows(ctx context.Context, row *plan.Row, p plan.Plan, right bool) (err error) { r.cursor = 0 r.matchedRows = nil p.Close() for { var cmpRow *plan.Row cmpRow, err = p.Next(ctx) if err != nil { return errors.Trace(err) } if cmpRow == nil { break } // Do append(s1, s2) safely. Sometime the s1 capability is larger than its real length, so // multi append may overwrite last valid data, e.g, // s1 = make([]interface{}, 0, 1) // s = append(s1, []interface{}{1}) // ss = append(ss, s) // s = append(s1, []interface{}{2}) // ss = append(ss, s) // We will see that ss only contains 2. joined := make([]interface{}, 0, len(cmpRow.Data)+len(row.Data)) if right { joined = append(append(joined, cmpRow.Data...), row.Data...) } else { joined = append(append(joined, row.Data...), cmpRow.Data...) } r.evalArgs[expression.ExprEvalIdentFunc] = func(name string) (interface{}, error) { return GetIdentValue(name, r.Fields, joined, field.DefaultFieldFlag) } var b bool b, err = expression.EvalBoolExpr(ctx, r.On, r.evalArgs) if err != nil { return errors.Trace(err) } if b { cmpRow.Data = joined keys := make([]*plan.RowKeyEntry, 0, len(row.RowKeys)+len(cmpRow.RowKeys)) cmpRow.RowKeys = append(append(keys, row.RowKeys...), cmpRow.RowKeys...) r.matchedRows = append(r.matchedRows, cmpRow) } } if len(r.matchedRows) == 0 { if right { leftLen := len(r.Fields) - len(r.Right.GetFields()) row.Data = append(make([]interface{}, leftLen), row.Data...) } else { rightLen := len(r.Fields) - len(r.Left.GetFields()) row.Data = append(row.Data, make([]interface{}, rightLen)...) } r.matchedRows = append(r.matchedRows, row) } return nil }
func (r *JoinPlan) findMatchedRows(ctx context.Context, row *plan.Row, right bool) (err error) { var p plan.Plan if right { p = r.Left } else { p = r.Right } r.cursor = 0 r.matchedRows = nil p.Close() for { var cmpRow *plan.Row cmpRow, err = p.Next(ctx) if err != nil { return errors.Trace(err) } if cmpRow == nil { break } var joined []interface{} if right { joined = append(cmpRow.Data, row.Data...) } else { joined = append(row.Data, cmpRow.Data...) } r.evalArgs[expressions.ExprEvalIdentFunc] = func(name string) (interface{}, error) { return GetIdentValue(name, r.Fields, joined, field.DefaultFieldFlag) } var b bool b, err = expressions.EvalBoolExpr(ctx, r.On, r.evalArgs) if err != nil { return errors.Trace(err) } if b { cmpRow.Data = joined cmpRow.RowKeys = append(row.RowKeys, cmpRow.RowKeys...) r.matchedRows = append(r.matchedRows, cmpRow) } } if len(r.matchedRows) == 0 { if right { leftLen := len(r.Fields) - len(r.Right.GetFields()) row.Data = append(make([]interface{}, leftLen), row.Data...) } else { rightLen := len(r.Fields) - len(r.Left.GetFields()) row.Data = append(row.Data, make([]interface{}, rightLen)...) } r.matchedRows = append(r.matchedRows, row) } return nil }