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

Commit 34a9f58

Browse files
Add a registry for VIEWs to the catalog
Signed-off-by: Alejandro García Montoro <alejandro.garciamontoro@gmail.com>
1 parent 06c7785 commit 34a9f58

File tree

4 files changed

+89
-8
lines changed

4 files changed

+89
-8
lines changed

sql/catalog.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ var ErrDatabaseNotFound = errors.NewKind("database not found: %s")
1717
type Catalog struct {
1818
FunctionRegistry
1919
*IndexRegistry
20+
*ViewRegistry
2021
*ProcessList
2122
*MemoryManager
2223

@@ -37,6 +38,7 @@ func NewCatalog() *Catalog {
3738
return &Catalog{
3839
FunctionRegistry: NewFunctionRegistry(),
3940
IndexRegistry: NewIndexRegistry(),
41+
ViewRegistry: NewViewRegistry(),
4042
MemoryManager: NewMemoryManager(ProcessMemory),
4143
ProcessList: NewProcessList(),
4244
locks: make(sessionLocks),

sql/parse/views.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package parse
33
import (
44
"bufio"
55
"strings"
6-
// "io"
76

87
"github.com/src-d/go-mysql-server/sql"
98
"github.com/src-d/go-mysql-server/sql/plan"

sql/plan/create_view.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
type CreateView struct {
1111
UnaryNode
12-
Database sql.Database
12+
database sql.Database
1313
Name string
1414
Columns []string
1515
Catalog *sql.Catalog
@@ -37,16 +37,15 @@ func (create *CreateView) Children() []sql.Node {
3737

3838
// Resolved implements the Node interface.
3939
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()
40+
_, ok := create.database.(sql.UnresolvedDatabase)
41+
return !ok && create.Child.Resolved()
4342
}
4443

4544
// RowIter implements the Node interface.
4645
func (create *CreateView) RowIter(ctx *sql.Context) (sql.RowIter, error) {
47-
// TODO: add it to the register
46+
view := sql.View{create.Name, create.Child}
4847

49-
return sql.RowsToRowIter(), nil
48+
return sql.RowsToRowIter(), create.Catalog.ViewRegistry.Register(create.database.Name(), view)
5049
}
5150

5251
// Schema implements the Node interface.
@@ -57,7 +56,7 @@ func (create *CreateView) String() string {
5756
_ = pr.WriteNode("CreateView(%s)", create.Name)
5857
_ = pr.WriteChildren(
5958
fmt.Sprintf("Columns (%s)", strings.Join(create.Columns, ", ")),
60-
fmt.Sprintf("As (%s)", create.Child.String()),
59+
create.Child.String(),
6160
)
6261
return pr.String()
6362
}

sql/viewregistry.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package sql
2+
3+
import (
4+
"sync"
5+
6+
"gopkg.in/src-d/go-errors.v1"
7+
)
8+
9+
var ErrExistingView = errors.NewKind("the view %s.%s already exists in the registry")
10+
var ErrNonExistingView = errors.NewKind("the view %s.%s does not exist in the registry")
11+
12+
type View struct {
13+
Name string
14+
Definition Node
15+
}
16+
17+
type viewKey struct {
18+
dbName, viewName string
19+
}
20+
21+
type ViewRegistry struct {
22+
mutex sync.RWMutex
23+
views map[viewKey]View
24+
}
25+
26+
func NewViewRegistry() *ViewRegistry {
27+
return &ViewRegistry{
28+
views: make(map[viewKey]View),
29+
}
30+
}
31+
32+
func (registry *ViewRegistry) Register(database string, view View) error {
33+
registry.mutex.Lock()
34+
defer registry.mutex.Unlock()
35+
36+
key := viewKey{database, view.Name}
37+
38+
if _, ok := registry.views[key]; ok {
39+
return ErrExistingView.New(database, view.Name)
40+
}
41+
42+
registry.views[key] = view
43+
return nil
44+
}
45+
46+
func (registry *ViewRegistry) Delete(databaseName, viewName string) error {
47+
key := viewKey{databaseName, viewName}
48+
49+
if _, ok := registry.views[key]; !ok {
50+
return ErrNonExistingView.New(databaseName, viewName)
51+
}
52+
53+
delete(registry.views, key)
54+
return nil
55+
}
56+
57+
func (registry *ViewRegistry) View(databaseName, viewName string) (*View, error) {
58+
registry.mutex.RLock()
59+
defer registry.mutex.RUnlock()
60+
61+
key := viewKey{databaseName, viewName}
62+
63+
if view, ok := registry.views[key]; ok {
64+
return &view, nil
65+
}
66+
67+
return nil, ErrNonExistingView.New(databaseName, viewName)
68+
}
69+
70+
func (registry *ViewRegistry) ViewsInDatabase(databaseName string) (views []View) {
71+
registry.mutex.RLock()
72+
defer registry.mutex.RUnlock()
73+
74+
for key, value := range registry.views {
75+
if key.dbName == databaseName {
76+
views = append(views, value)
77+
}
78+
}
79+
80+
return views
81+
}

0 commit comments

Comments
 (0)