forked from src-d/go-mysql-server
/
resolve_subqueries.go
49 lines (41 loc) · 1.08 KB
/
resolve_subqueries.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
48
49
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 resolveSubqueries(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error) {
span, ctx := ctx.Span("resolve_subqueries")
defer span.Finish()
a.Log("resolving subqueries")
n, err := plan.TransformUp(n, func(n sql.Node) (sql.Node, error) {
switch n := n.(type) {
case *plan.SubqueryAlias:
a.Log("found subquery %q with child of type %T", n.Name(), n.Child)
child, err := a.Analyze(ctx, n.Child)
if err != nil {
return nil, err
}
return plan.NewSubqueryAlias(n.Name(), child), nil
default:
return n, nil
}
})
if err != nil {
return nil, err
}
return plan.TransformExpressionsUp(n, func(e sql.Expression) (sql.Expression, error) {
s, ok := e.(*expression.Subquery)
if !ok || s.Resolved() {
return e, nil
}
q, err := a.Analyze(ctx, s.Query)
if err != nil {
return nil, err
}
if qp, ok := q.(*plan.QueryProcess); ok {
q = qp.Child
}
return s.WithQuery(q), nil
})
}