func makeUsedList(usedCols []*expression.Column, schema expression.Schema) []bool { used := make([]bool, len(schema)) for _, col := range usedCols { idx := schema.GetIndex(col) if idx == -1 { log.Errorf("Can't find column %s from schema %s.", col.ToString(), schema.ToString()) } used[idx] = true } return used }
// columnSubstitute substitutes the columns in filter to expressions in select fields. // e.g. select * from (select b as a from t) k where a < 10 => select * from (select b as a from t where b < 10) k. func columnSubstitute(expr expression.Expression, schema expression.Schema, newExprs []expression.Expression) expression.Expression { switch v := expr.(type) { case *expression.Column: id := schema.GetIndex(v) if id == -1 { log.Errorf("Can't find columns %s in schema %s", v.ToString(), schema.ToString()) } return newExprs[id] case *expression.ScalarFunction: for i, arg := range v.Args { v.Args[i] = columnSubstitute(arg, schema, newExprs) } } return expr }
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 from schema %s.", expr.ToString(), schema.ToString()) } return newColumn, nil } } return expr, nil }