forked from src-d/go-mysql-server
/
resolve_functions.go
47 lines (38 loc) · 1.01 KB
/
resolve_functions.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package analyzer
import (
"github.com/src-d/go-mysql-server/sql"
"github.com/src-d/go-mysql-server/sql/expression"
"github.com/src-d/go-mysql-server/sql/plan"
)
func resolveFunctions(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error) {
span, _ := ctx.Span("resolve_functions")
defer span.Finish()
a.Log("resolve functions, node of type %T", n)
return plan.TransformUp(n, func(n sql.Node) (sql.Node, error) {
a.Log("transforming node of type: %T", n)
if n.Resolved() {
return n, nil
}
return plan.TransformExpressionsUp(n, func(e sql.Expression) (sql.Expression, error) {
a.Log("transforming expression of type: %T", e)
if e.Resolved() {
return e, nil
}
uf, ok := e.(*expression.UnresolvedFunction)
if !ok {
return e, nil
}
n := uf.Name()
f, err := a.Catalog.Function(n)
if err != nil {
return nil, err
}
rf, err := f.Call(uf.Arguments...)
if err != nil {
return nil, err
}
a.Log("resolved function %q", n)
return rf, nil
})
})
}