Skip to content

Commit 1102cd4

Browse files
ajnavarrosmola
authored andcommitted
plan: Added SHOW TABLES query (#64)
1 parent 4744a84 commit 1102cd4

File tree

8 files changed

+154
-6
lines changed

8 files changed

+154
-6
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ gitql supports a subset of the SQL standard, currently including:
5757
* `WHERE` (`=` only)
5858
* `ORDER BY` (with `ASC` and `DESC`)
5959
* `LIMIT`
60+
* `SHOW TABLES`
6061

6162
## License
6263

sql/analyzer/rules.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,24 @@ import (
99
var DefaultRules = []Rule{
1010
{"resolve_tables", resolveTables},
1111
{"resolve_columns", resolveColumns},
12+
{"resolve_database", resolveDatabase},
1213
{"resolve_star", resolveStar},
1314
}
1415

16+
func resolveDatabase(a *Analyzer, n sql.Node) sql.Node {
17+
_, ok := n.(*plan.ShowTables)
18+
if !ok {
19+
return n
20+
}
21+
22+
db, err := a.Catalog.Database(a.CurrentDatabase)
23+
if err != nil {
24+
return n
25+
}
26+
27+
return plan.NewShowTables(db)
28+
}
29+
1530
func resolveTables(a *Analyzer, n sql.Node) sql.Node {
1631
return n.TransformUp(func(n sql.Node) sql.Node {
1732
t, ok := n.(*plan.UnresolvedTable)

sql/core.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,9 @@ type Table interface {
2828
Node
2929
}
3030

31+
type Database interface {
32+
Nameable
33+
Tables() map[string]Table
34+
}
35+
3136
var ErrInvalidType = errors.New("invalid type")

sql/database.go

Lines changed: 0 additions & 6 deletions
This file was deleted.

sql/parse/parse.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ import (
1212
"github.com/youtube/vitess/go/vt/sqlparser"
1313
)
1414

15+
const (
16+
showTables = "SHOW TABLES"
17+
)
18+
1519
func errUnsupported(n sqlparser.SQLNode) error {
1620
return fmt.Errorf("unsupported syntax: %#v", n)
1721
}
@@ -25,6 +29,11 @@ func Parse(s string) (sql.Node, error) {
2529
s = s[:len(s)-1]
2630
}
2731

32+
// TODO implement it into the parser
33+
if strings.ToUpper(s) == showTables {
34+
return plan.NewShowTables(&sql.UnresolvedDatabase{}), nil
35+
}
36+
2837
stmt, err := sqlparser.Parse(s)
2938
if err != nil {
3039
return nil, err

sql/plan/show_tables.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package plan
2+
3+
import (
4+
"io"
5+
"sort"
6+
7+
"github.com/gitql/gitql/sql"
8+
)
9+
10+
type ShowTables struct {
11+
database sql.Database
12+
}
13+
14+
func NewShowTables(database sql.Database) *ShowTables {
15+
return &ShowTables{
16+
database: database,
17+
}
18+
}
19+
20+
func (p *ShowTables) Resolved() bool {
21+
_, ok := p.database.(*sql.UnresolvedDatabase)
22+
return !ok
23+
}
24+
25+
func (*ShowTables) Children() []sql.Node {
26+
return nil
27+
}
28+
29+
func (*ShowTables) Schema() sql.Schema {
30+
return sql.Schema{{
31+
"table", sql.String,
32+
}}
33+
}
34+
35+
func (p *ShowTables) RowIter() (sql.RowIter, error) {
36+
tableNames := []string{}
37+
for key := range p.database.Tables() {
38+
tableNames = append(tableNames, key)
39+
}
40+
41+
sort.Strings(tableNames)
42+
43+
return &showTablesIter{tableNames: tableNames}, nil
44+
}
45+
46+
func (p *ShowTables) TransformUp(f func(sql.Node) sql.Node) sql.Node {
47+
return f(NewShowTables(p.database))
48+
}
49+
50+
func (p *ShowTables) TransformExpressionsUp(f func(sql.Expression) sql.Expression) sql.Node {
51+
return p
52+
}
53+
54+
type showTablesIter struct {
55+
tableNames []string
56+
idx int
57+
}
58+
59+
func (i *showTablesIter) Next() (sql.Row, error) {
60+
if i.idx >= len(i.tableNames) {
61+
return nil, io.EOF
62+
}
63+
row := sql.NewMemoryRow(i.tableNames[i.idx])
64+
i.idx++
65+
66+
return row, nil
67+
}

sql/plan/show_tables_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package plan
2+
3+
import (
4+
"io"
5+
"testing"
6+
7+
"github.com/gitql/gitql/mem"
8+
"github.com/gitql/gitql/sql"
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
func TestShowTables(t *testing.T) {
13+
assert := assert.New(t)
14+
15+
unresolvedShowTables := NewShowTables(&sql.UnresolvedDatabase{})
16+
17+
assert.False(unresolvedShowTables.Resolved())
18+
assert.Nil(unresolvedShowTables.Children())
19+
20+
db := mem.NewDatabase("test")
21+
db.AddTable("test1", mem.NewTable("test1", nil))
22+
db.AddTable("test2", mem.NewTable("test2", nil))
23+
db.AddTable("test3", mem.NewTable("test3", nil))
24+
25+
resolvedShowTables := NewShowTables(db)
26+
assert.True(resolvedShowTables.Resolved())
27+
assert.Nil(resolvedShowTables.Children())
28+
29+
iter, err := resolvedShowTables.RowIter()
30+
assert.Nil(err)
31+
32+
res, err := iter.Next()
33+
assert.Nil(err)
34+
assert.Equal("test1", res.Fields()[0])
35+
36+
res, err = iter.Next()
37+
assert.Nil(err)
38+
assert.Equal("test2", res.Fields()[0])
39+
40+
res, err = iter.Next()
41+
assert.Nil(err)
42+
assert.Equal("test3", res.Fields()[0])
43+
44+
_, err = iter.Next()
45+
assert.Equal(io.EOF, err)
46+
}

sql/unresolved_database.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package sql
2+
3+
type UnresolvedDatabase struct{}
4+
5+
func (d *UnresolvedDatabase) Name() string {
6+
return "unresolved_database"
7+
}
8+
9+
func (d *UnresolvedDatabase) Tables() map[string]Table {
10+
return make(map[string]Table)
11+
}

0 commit comments

Comments
 (0)