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

Commit 1220b98

Browse files
Add views to SHOW TABLES
Signed-off-by: Alejandro García Montoro <[email protected]>
1 parent 9b8ecfa commit 1220b98

File tree

4 files changed

+69
-23
lines changed

4 files changed

+69
-23
lines changed

Diff for: sql/analyzer/assign_catalog.go

+4
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ func assignCatalog(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error)
6868
nc := *node
6969
nc.Catalog = a.Catalog
7070
return &nc, nil
71+
case *plan.ShowTables:
72+
nc := *node
73+
nc.Catalog = a.Catalog
74+
return &nc, nil
7175
default:
7276
return n, nil
7377
}

Diff for: sql/analyzer/assign_catalog_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,10 @@ func TestAssignCatalog(t *testing.T) {
8787
dv, ok := node.(*plan.DropView)
8888
require.True(ok)
8989
require.Equal(c, dv.Catalog)
90+
91+
node, err = f.Apply(sql.NewEmptyContext(), a, plan.NewShowTables(db, false))
92+
require.NoError(err)
93+
st, ok := node.(*plan.ShowTables)
94+
require.True(ok)
95+
require.Equal(c, st.Catalog)
9096
}

Diff for: sql/plan/show_tables.go

+21-8
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package plan
22

33
import (
4-
"sort"
5-
64
"github.com/src-d/go-mysql-server/sql"
75
)
86

97
// ShowTables is a node that shows the database tables.
108
type ShowTables struct {
11-
db sql.Database
12-
Full bool
9+
db sql.Database
10+
Full bool
11+
Catalog *sql.Catalog
1312
}
1413

1514
var showTablesSchema = sql.Schema{
@@ -24,8 +23,9 @@ var showTablesFullSchema = sql.Schema{
2423
// NewShowTables creates a new show tables node given a database.
2524
func NewShowTables(database sql.Database, full bool) *ShowTables {
2625
return &ShowTables{
27-
db: database,
28-
Full: full,
26+
db: database,
27+
Full: full,
28+
Catalog: nil,
2929
}
3030
}
3131

@@ -70,16 +70,29 @@ func (p *ShowTables) RowIter(ctx *sql.Context) (sql.RowIter, error) {
7070
tableNames = append(tableNames, key)
7171
}
7272

73-
sort.Strings(tableNames)
73+
views := p.Catalog.ViewRegistry.ViewsInDatabase(p.db.Name())
74+
numViews := len(views)
75+
viewNames := make([]string, numViews)
76+
for i, view := range views {
77+
viewNames[i] = view.Name()
78+
}
7479

75-
var rows = make([]sql.Row, len(tableNames))
80+
numTables := len(tableNames)
81+
var rows = make([]sql.Row, numTables+numViews)
7682
for i, n := range tableNames {
7783
row := sql.Row{n}
7884
if p.Full {
7985
row = append(row, "BASE TABLE")
8086
}
8187
rows[i] = row
8288
}
89+
for i, n := range viewNames {
90+
row := sql.Row{n}
91+
if p.Full {
92+
row = append(row, "VIEW")
93+
}
94+
rows[numTables+i] = row
95+
}
8396

8497
return sql.RowsToRowIter(rows...), nil
8598
}

Diff for: sql/plan/show_tables_test.go

+38-15
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package plan
22

33
import (
4-
"io"
4+
"sort"
55
"testing"
66

77
"github.com/src-d/go-mysql-server/memory"
@@ -13,35 +13,58 @@ func TestShowTables(t *testing.T) {
1313
require := require.New(t)
1414
ctx := sql.NewEmptyContext()
1515

16+
catalog := sql.NewCatalog()
17+
1618
unresolvedShowTables := NewShowTables(sql.UnresolvedDatabase(""), false)
19+
unresolvedShowTables.Catalog = catalog
1720

1821
require.False(unresolvedShowTables.Resolved())
1922
require.Nil(unresolvedShowTables.Children())
2023

24+
tables := []string{"test1", "test2", "test3"}
25+
views := []string{"view1", "view2"}
26+
2127
db := memory.NewDatabase("test")
22-
db.AddTable("test1", memory.NewTable("test1", nil))
23-
db.AddTable("test2", memory.NewTable("test2", nil))
24-
db.AddTable("test3", memory.NewTable("test3", nil))
28+
for _, table := range tables {
29+
db.AddTable(table, memory.NewTable(table, nil))
30+
}
31+
for _, view := range views {
32+
err := catalog.ViewRegistry.Register(db.Name(), sql.NewView(view, nil))
33+
require.NoError(err)
34+
}
35+
36+
resolvedShowTables := NewShowTables(db, true)
37+
resolvedShowTables.Catalog = catalog
2538

26-
resolvedShowTables := NewShowTables(db, false)
2739
require.True(resolvedShowTables.Resolved())
2840
require.Nil(resolvedShowTables.Children())
2941

3042
iter, err := resolvedShowTables.RowIter(ctx)
3143
require.NoError(err)
3244

33-
res, err := iter.Next()
45+
rows, err := sql.RowIterToRows(iter)
3446
require.NoError(err)
35-
require.Equal("test1", res[0])
3647

37-
res, err = iter.Next()
38-
require.NoError(err)
39-
require.Equal("test2", res[0])
48+
var actualTables []string
49+
var actualViews []string
50+
for _, row := range rows {
51+
name, ok := row[0].(string)
52+
require.True(ok)
53+
switch row[1] {
54+
case "BASE TABLE":
55+
actualTables = append(actualTables, name)
56+
case "VIEW":
57+
actualViews = append(actualViews, name)
58+
default:
59+
require.FailNow("only values 'BASE TABLE' and 'VIEW' are expected")
60+
}
61+
}
4062

41-
res, err = iter.Next()
42-
require.NoError(err)
43-
require.Equal("test3", res[0])
63+
sort.Strings(tables)
64+
sort.Strings(actualTables)
65+
require.Equal(tables, actualTables)
4466

45-
_, err = iter.Next()
46-
require.Equal(io.EOF, err)
67+
sort.Strings(views)
68+
sort.Strings(actualViews)
69+
require.Equal(views, actualViews)
4770
}

0 commit comments

Comments
 (0)