Skip to content
This repository was archived by the owner on Jan 28, 2021. It is now read-only.

Commit 079e419

Browse files
Resolve Catalog in CreateView node
Signed-off-by: Alejandro García Montoro <alejandro.garciamontoro@gmail.com>
1 parent b820870 commit 079e419

File tree

6 files changed

+39
-142
lines changed

6 files changed

+39
-142
lines changed

sql/analyzer/assign_catalog.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ func assignCatalog(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error)
6060
nc := *node
6161
nc.Catalog = a.Catalog
6262
return &nc, nil
63+
case *plan.CreateView:
64+
nc := *node
65+
nc.Catalog = a.Catalog
66+
return &nc, nil
6367
default:
6468
return n, nil
6569
}

sql/index.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@ func exprListsEqual(a, b []string) bool {
512512
// marked as creating, so nobody can't register two indexes with the same
513513
// expression or id while the other is still being created.
514514
// When something is sent through the returned channel, it means the index has
515-
// finished it's creation and will be marked as ready.
515+
// finished its creation and will be marked as ready.
516516
// Another channel is returned to notify the user when the index is ready.
517517
func (r *IndexRegistry) AddIndex(
518518
idx Index,

sql/parse/parse.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ var (
3636
var (
3737
describeTablesRegex = regexp.MustCompile(`^(describe|desc)\s+table\s+(.*)`)
3838
createIndexRegex = regexp.MustCompile(`^create\s+index\s+`)
39-
createViewRegex = regexp.MustCompile(`^create\s+(or\s+replace\s+)?view\s+`)
39+
createViewRegex = regexp.MustCompile(`^create\s+(or\s+replace\s+)?view\s+`)
4040
dropIndexRegex = regexp.MustCompile(`^drop\s+index\s+`)
4141
showIndexRegex = regexp.MustCompile(`^show\s+(index|indexes|keys)\s+(from|in)\s+\S+\s*`)
4242
showCreateRegex = regexp.MustCompile(`^show create\s+\S+\s*`)

sql/parse/util.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ func expectQuote(r *bufio.Reader) error {
310310
}
311311

312312
func maybe(matched *bool, str string) parseFunc {
313-
return func (rd *bufio.Reader) error {
313+
return func(rd *bufio.Reader) error {
314314
*matched = false
315315
strLength := len(str)
316316

@@ -340,7 +340,7 @@ func maybe(matched *bool, str string) parseFunc {
340340
}
341341

342342
func multiMaybe(matched *bool, strings ...string) parseFunc {
343-
return func (rd *bufio.Reader) error {
343+
return func(rd *bufio.Reader) error {
344344
*matched = false
345345
first := true
346346
for _, str := range strings {

sql/parse/views.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,10 @@ var ErrMalformedCreateView = errors.NewKind("view definition %#v is not a SELECT
2020
func parseCreateView(ctx *sql.Context, s string) (sql.Node, error) {
2121
r := bufio.NewReader(strings.NewReader(s))
2222

23-
2423
var (
2524
viewName, subquery string
26-
columns []string
27-
isReplace bool
25+
columns []string
26+
isReplace bool
2827
)
2928

3029
err := parseFuncs{

sql/plan/create_view.go

Lines changed: 29 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -3,178 +3,72 @@ package plan
33
import (
44
"fmt"
55
"strings"
6-
// "time"
76

8-
// opentracing "github.com/opentracing/opentracing-go"
9-
// otlog "github.com/opentracing/opentracing-go/log"
10-
// "github.com/sirupsen/logrus"
117
"github.com/src-d/go-mysql-server/sql"
12-
// "github.com/src-d/go-mysql-server/sql/expression"
13-
// errors "gopkg.in/src-d/go-errors.v1"
148
)
159

1610
type CreateView struct {
17-
Database sql.Database
18-
Name string
19-
Columns []string
20-
Definition *SubqueryAlias
11+
UnaryNode
12+
Database sql.Database
13+
Name string
14+
Columns []string
15+
Catalog *sql.Catalog
2116
}
2217

2318
func NewCreateView(
24-
database sql.Database,
25-
name string,
19+
database sql.Database,
20+
name string,
2621
columns []string,
2722
definition *SubqueryAlias,
2823
) *CreateView {
2924
return &CreateView{
30-
Database: database,
31-
Name: name,
32-
Columns: columns,
33-
Definition: definition,
25+
UnaryNode{Child: definition},
26+
database,
27+
name,
28+
columns,
29+
nil,
3430
}
3531
}
3632

3733
// Children implements the Node interface.
38-
func (c *CreateView) Children() []sql.Node { return nil }
34+
func (create *CreateView) Children() []sql.Node {
35+
return []sql.Node{create.Child}
36+
}
3937

4038
// Resolved implements the Node interface.
41-
func (c *CreateView) Resolved() bool {
42-
_, ok := c.Database.(sql.UnresolvedDatabase)
43-
return !ok && c.Definition.Resolved()
39+
func (create *CreateView) Resolved() bool {
40+
// TOOD: Check whether the database has been resolved
41+
// _, ok := create.Database.(sql.UnresolvedDatabase)
42+
return create.Child.Resolved()
4443
}
45-
//
46-
// func getIndexableTable(t sql.Table) (sql.IndexableTable, error) {
47-
// switch t := t.(type) {
48-
// case sql.IndexableTable:
49-
// return t, nil
50-
// case sql.TableWrapper:
51-
// return getIndexableTable(t.Underlying())
52-
// default:
53-
// return nil, ErrNotIndexable.New()
54-
// }
55-
// }
56-
//
57-
// func getChecksumable(t sql.Table) sql.Checksumable {
58-
// switch t := t.(type) {
59-
// case sql.Checksumable:
60-
// return t
61-
// case sql.TableWrapper:
62-
// return getChecksumable(t.Underlying())
63-
// default:
64-
// return nil
65-
// }
66-
// }
67-
//
44+
6845
// RowIter implements the Node interface.
69-
func (c *CreateView) RowIter(ctx *sql.Context) (sql.RowIter, error) {
46+
func (create *CreateView) RowIter(ctx *sql.Context) (sql.RowIter, error) {
7047
// TODO: add it to the register
7148

72-
// table, ok := c.Table.(*ResolvedTable)
73-
// if !ok {
74-
// return nil, ErrNotIndexable.New()
75-
// }
76-
//
77-
// indexable, err := getIndexableTable(table.Table)
78-
// if err != nil {
79-
// return nil, err
80-
// }
81-
//
82-
// var driver sql.IndexDriver
83-
// if c.Driver == "" {
84-
// driver = c.Catalog.DefaultIndexDriver()
85-
// } else {
86-
// driver = c.Catalog.IndexDriver(c.Driver)
87-
// }
88-
//
89-
// if driver == nil {
90-
// return nil, ErrInvalidIndexDriver.New(c.Driver)
91-
// }
92-
//
93-
// columns, exprs, err := getColumnsAndPrepareExpressions(c.Exprs)
94-
// if err != nil {
95-
// return nil, err
96-
// }
97-
//
98-
// for _, e := range exprs {
99-
// if e.Type() == sql.Blob || e.Type() == sql.JSON {
100-
// return nil, ErrExprTypeNotIndexable.New(e, e.Type())
101-
// }
102-
// }
103-
//
104-
// if ch := getChecksumable(table.Table); ch != nil {
105-
// c.Config[sql.ChecksumKey], err = ch.Checksum()
106-
// if err != nil {
107-
// return nil, err
108-
// }
109-
// }
110-
//
111-
// index, err := driver.Create(
112-
// c.CurrentDatabase,
113-
// table.Name(),
114-
// c.Name,
115-
// exprs,
116-
// c.Config,
117-
// )
118-
// if err != nil {
119-
// return nil, err
120-
// }
121-
//
122-
// iter, err := indexable.IndexKeyValues(ctx, columns)
123-
// if err != nil {
124-
// return nil, err
125-
// }
126-
//
127-
// iter = &evalPartitionKeyValueIter{
128-
// ctx: ctx,
129-
// columns: columns,
130-
// exprs: exprs,
131-
// iter: iter,
132-
// }
133-
//
134-
// created, ready, err := c.Catalog.AddIndex(index)
135-
// if err != nil {
136-
// return nil, err
137-
// }
138-
//
139-
// log := logrus.WithFields(logrus.Fields{
140-
// "id": index.ID(),
141-
// "driver": index.Driver(),
142-
// })
143-
//
144-
// createIndex := func() {
145-
// c.createIndex(ctx, log, driver, index, iter, created, ready)
146-
// c.Catalog.ProcessList.Done(ctx.Pid())
147-
// }
148-
//
149-
// log.WithField("async", c.Async).Info("starting to save the index")
150-
//
151-
// if c.Async {
152-
// go createIndex()
153-
// } else {
154-
// createIndex()
155-
// }
156-
15749
return sql.RowsToRowIter(), nil
15850
}
15951

16052
// Schema implements the Node interface.
161-
func (c *CreateView) Schema() sql.Schema { return nil }
53+
func (create *CreateView) Schema() sql.Schema { return nil }
16254

16355
func (create *CreateView) String() string {
16456
pr := sql.NewTreePrinter()
16557
_ = pr.WriteNode("CreateView(%s)", create.Name)
16658
_ = pr.WriteChildren(
16759
fmt.Sprintf("Columns (%s)", strings.Join(create.Columns, ", ")),
168-
fmt.Sprintf("As (%s)", create.Definition.String()),
60+
fmt.Sprintf("As (%s)", create.Child.String()),
16961
)
17062
return pr.String()
17163
}
17264

17365
// WithChildren implements the Node interface.
174-
func (c *CreateView) WithChildren(children ...sql.Node) (sql.Node, error) {
175-
if len(children) != 0 {
176-
return nil, sql.ErrInvalidChildrenNumber.New(c, len(children), 0)
66+
func (create *CreateView) WithChildren(children ...sql.Node) (sql.Node, error) {
67+
if len(children) != 1 {
68+
return nil, sql.ErrInvalidChildrenNumber.New(create, len(children), 1)
17769
}
17870

179-
return c, nil
71+
newCreate := create
72+
newCreate.Child = children[0]
73+
return newCreate, nil
18074
}

0 commit comments

Comments
 (0)