func (a *havingAndOrderbyExprResolver) resolveFromSchema(v *ast.ColumnNameExpr, schema expression.Schema) (int, error) { col, err := schema.FindColumn(v.Name) if err != nil { return -1, errors.Trace(err) } if col == nil { return -1, nil } newColName := &ast.ColumnName{ Schema: col.DBName, Table: col.TblName, Name: col.ColName, } for i, field := range a.selectFields { if c, ok := field.Expr.(*ast.ColumnNameExpr); ok && colMatch(newColName, c.Name) { return i, nil } } sf := &ast.SelectField{ Expr: &ast.ColumnNameExpr{Name: newColName}, Auxiliary: true, } sf.Expr.SetType(col.GetType()) a.selectFields = append(a.selectFields, sf) return len(a.selectFields) - 1, nil }
func (e *havingAndOrderbyResolver) Enter(inNode ast.Node) (ast.Node, bool) { switch v := inNode.(type) { case *ast.ValueExpr, *ast.ColumnName, *ast.ParenthesesExpr: case *ast.ColumnNameExpr: var first, second expression.Schema var col *expression.Column fromSchema := e.proj.GetChildByIndex(0).GetSchema() fromSchemaFirst := e.orderBy && e.inExpr if fromSchemaFirst { first, second = fromSchema, e.proj.GetSchema() col, e.err = first.FindColumn(v.Name) } else { first, second = e.proj.GetSchema(), fromSchema col, e.err = first.FindSelectFieldColumn(v.Name, e.proj.Exprs) } if e.err != nil { return inNode, true } if col == nil { if fromSchemaFirst { col, e.err = second.FindSelectFieldColumn(v.Name, e.proj.Exprs) } else { col, e.err = second.FindColumn(v.Name) } if e.err != nil { return inNode, true } if col == nil { e.err = errors.Errorf("Can't find Column %s", v.Name.Name) return inNode, true } if !fromSchemaFirst { e.addProjectionExpr(v, col) } else { e.mapper[v] = col } } else if fromSchemaFirst { e.addProjectionExpr(v, col) } else { e.mapper[v] = col } case *ast.SubqueryExpr, *ast.CompareSubqueryExpr, *ast.ExistsSubqueryExpr: return inNode, true default: e.inExpr = true } return inNode, false }
func (a *AggregateFuncExtractor) resolveFromSchema(v *ast.ColumnNameExpr, schema expression.Schema) (int, error) { col, err := schema.FindColumn(v.Name) if err != nil { return -1, errors.Trace(err) } if col == nil { return -1, nil } newColName := &ast.ColumnName{ Schema: col.DBName, Table: col.TblName, Name: col.ColName, } for i, field := range a.selectFields { if c, ok := field.Expr.(*ast.ColumnNameExpr); ok && colMatch(newColName, c.Name) { return i, nil } } a.selectFields = append(a.selectFields, &ast.SelectField{ Expr: &ast.ColumnNameExpr{Name: newColName}, Auxiliary: true, }) return len(a.selectFields) - 1, nil }