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

Commit

Permalink
Add views to SHOW TABLES
Browse files Browse the repository at this point in the history
Signed-off-by: Alejandro García Montoro <[email protected]>
  • Loading branch information
agarciamontoro committed Oct 29, 2019
1 parent 9b8ecfa commit 1220b98
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 23 deletions.
4 changes: 4 additions & 0 deletions sql/analyzer/assign_catalog.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ func assignCatalog(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error)
nc := *node
nc.Catalog = a.Catalog
return &nc, nil
case *plan.ShowTables:
nc := *node
nc.Catalog = a.Catalog
return &nc, nil
default:
return n, nil
}
Expand Down
6 changes: 6 additions & 0 deletions sql/analyzer/assign_catalog_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,10 @@ func TestAssignCatalog(t *testing.T) {
dv, ok := node.(*plan.DropView)
require.True(ok)
require.Equal(c, dv.Catalog)

node, err = f.Apply(sql.NewEmptyContext(), a, plan.NewShowTables(db, false))
require.NoError(err)
st, ok := node.(*plan.ShowTables)
require.True(ok)
require.Equal(c, st.Catalog)
}
29 changes: 21 additions & 8 deletions sql/plan/show_tables.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package plan

import (
"sort"

"github.com/src-d/go-mysql-server/sql"
)

// ShowTables is a node that shows the database tables.
type ShowTables struct {
db sql.Database
Full bool
db sql.Database
Full bool
Catalog *sql.Catalog
}

var showTablesSchema = sql.Schema{
Expand All @@ -24,8 +23,9 @@ var showTablesFullSchema = sql.Schema{
// NewShowTables creates a new show tables node given a database.
func NewShowTables(database sql.Database, full bool) *ShowTables {
return &ShowTables{
db: database,
Full: full,
db: database,
Full: full,
Catalog: nil,
}
}

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

sort.Strings(tableNames)
views := p.Catalog.ViewRegistry.ViewsInDatabase(p.db.Name())
numViews := len(views)
viewNames := make([]string, numViews)
for i, view := range views {
viewNames[i] = view.Name()
}

var rows = make([]sql.Row, len(tableNames))
numTables := len(tableNames)
var rows = make([]sql.Row, numTables+numViews)
for i, n := range tableNames {
row := sql.Row{n}
if p.Full {
row = append(row, "BASE TABLE")
}
rows[i] = row
}
for i, n := range viewNames {
row := sql.Row{n}
if p.Full {
row = append(row, "VIEW")
}
rows[numTables+i] = row
}

return sql.RowsToRowIter(rows...), nil
}
Expand Down
53 changes: 38 additions & 15 deletions sql/plan/show_tables_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package plan

import (
"io"
"sort"
"testing"

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

catalog := sql.NewCatalog()

unresolvedShowTables := NewShowTables(sql.UnresolvedDatabase(""), false)
unresolvedShowTables.Catalog = catalog

require.False(unresolvedShowTables.Resolved())
require.Nil(unresolvedShowTables.Children())

tables := []string{"test1", "test2", "test3"}
views := []string{"view1", "view2"}

db := memory.NewDatabase("test")
db.AddTable("test1", memory.NewTable("test1", nil))
db.AddTable("test2", memory.NewTable("test2", nil))
db.AddTable("test3", memory.NewTable("test3", nil))
for _, table := range tables {
db.AddTable(table, memory.NewTable(table, nil))
}
for _, view := range views {
err := catalog.ViewRegistry.Register(db.Name(), sql.NewView(view, nil))
require.NoError(err)
}

resolvedShowTables := NewShowTables(db, true)
resolvedShowTables.Catalog = catalog

resolvedShowTables := NewShowTables(db, false)
require.True(resolvedShowTables.Resolved())
require.Nil(resolvedShowTables.Children())

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

res, err := iter.Next()
rows, err := sql.RowIterToRows(iter)
require.NoError(err)
require.Equal("test1", res[0])

res, err = iter.Next()
require.NoError(err)
require.Equal("test2", res[0])
var actualTables []string
var actualViews []string
for _, row := range rows {
name, ok := row[0].(string)
require.True(ok)
switch row[1] {
case "BASE TABLE":
actualTables = append(actualTables, name)
case "VIEW":
actualViews = append(actualViews, name)
default:
require.FailNow("only values 'BASE TABLE' and 'VIEW' are expected")
}
}

res, err = iter.Next()
require.NoError(err)
require.Equal("test3", res[0])
sort.Strings(tables)
sort.Strings(actualTables)
require.Equal(tables, actualTables)

_, err = iter.Next()
require.Equal(io.EOF, err)
sort.Strings(views)
sort.Strings(actualViews)
require.Equal(views, actualViews)
}

0 comments on commit 1220b98

Please sign in to comment.