func retrieveColumnsInExpression(expr expression.Expression, schema expression.Schema) ( expression.Expression, error) { switch v := expr.(type) { case *expression.ScalarFunction: for i, arg := range v.Args { newExpr, err := retrieveColumnsInExpression(arg, schema) if err != nil { return nil, errors.Trace(err) } v.Args[i] = newExpr } case *expression.Column: if !v.Correlated { newColumn := schema.RetrieveColumn(v) if newColumn == nil { return nil, errors.Errorf("Can't Find column %s.", expr.ToString()) } return newColumn, nil } } return expr, nil }