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

Add support for VIEWs in SHOW TABLES statements #862

Draft
wants to merge 9 commits into
base: feature/views
Choose a base branch
from
Prev Previous commit
Next Next commit
Add views to SHOW TABLES
Signed-off-by: Alejandro García Montoro <alejandro.garciamontoro@gmail.com>
  • Loading branch information
agarciamontoro committed Oct 29, 2019
commit 1220b98113878dfcc4eabdf6da3f0b4c889192d6
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)
}
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy