Skip to content

Commit 4744a84

Browse files
authored
sql: add star (*) parsing and resolution. (#63)
1 parent f3acb58 commit 4744a84

File tree

5 files changed

+48
-9
lines changed

5 files changed

+48
-9
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ gitql exposes the following tables:
5353

5454
gitql supports a subset of the SQL standard, currently including:
5555

56-
* `SELECT` (`*` not supported yet)
56+
* `SELECT`
5757
* `WHERE` (`=` only)
5858
* `ORDER BY` (with `ASC` and `DESC`)
5959
* `LIMIT`

cmd/gitql/query.go

-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ func (c *CmdQuery) printQuery(schema sql.Schema, iter sql.RowIter) {
9595
w := tablewriter.NewWriter(os.Stdout)
9696
headers := []string{}
9797
for _, f := range schema {
98-
fmt.Printf("HEADER: %s\n", f.Name)
9998
headers = append(headers, f.Name)
10099
}
101100
w.SetHeader(headers)

sql/analyzer/analyzer_test.go

+12
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,18 @@ func TestAnalyzer_Analyze(t *testing.T) {
5252
assert.Nil(err)
5353
assert.Equal(expected, analyzed)
5454

55+
notAnalyzed = plan.NewProject(
56+
[]sql.Expression{expression.NewStar()},
57+
plan.NewUnresolvedTable("mytable"),
58+
)
59+
analyzed, err = a.Analyze(notAnalyzed)
60+
expected = plan.NewProject(
61+
[]sql.Expression{expression.NewGetField(0, sql.Integer, "i")},
62+
table,
63+
)
64+
assert.Nil(err)
65+
assert.Equal(expected, analyzed)
66+
5567
notAnalyzed = plan.NewProject(
5668
[]sql.Expression{
5769
expression.NewAlias(

sql/analyzer/rules.go

+28
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
var DefaultRules = []Rule{
1010
{"resolve_tables", resolveTables},
1111
{"resolve_columns", resolveColumns},
12+
{"resolve_star", resolveStar},
1213
}
1314

1415
func resolveTables(a *Analyzer, n sql.Node) sql.Node {
@@ -28,6 +29,33 @@ func resolveTables(a *Analyzer, n sql.Node) sql.Node {
2829
})
2930
}
3031

32+
func resolveStar(a *Analyzer, n sql.Node) sql.Node {
33+
if n.Resolved() {
34+
return n
35+
}
36+
37+
p, ok := n.(*plan.Project)
38+
if !ok {
39+
return n
40+
}
41+
42+
if len(p.Expressions) != 1 {
43+
return n
44+
}
45+
46+
if _, ok := p.Expressions[0].(*expression.Star); !ok {
47+
return n
48+
}
49+
50+
var exprs []sql.Expression
51+
for i, e := range p.Child.Schema() {
52+
gf := expression.NewGetField(i, e.Type, e.Name)
53+
exprs = append(exprs, gf)
54+
}
55+
56+
return plan.NewProject(exprs, p.Child)
57+
}
58+
3159
func resolveColumns(a *Analyzer, n sql.Node) sql.Node {
3260
if n.Resolved() {
3361
return n

sql/plan/project.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,19 @@ import (
66

77
type Project struct {
88
UnaryNode
9-
expressions []sql.Expression
9+
Expressions []sql.Expression
1010
}
1111

1212
func NewProject(expressions []sql.Expression, child sql.Node) *Project {
1313
return &Project{
1414
UnaryNode: UnaryNode{child},
15-
expressions: expressions,
15+
Expressions: expressions,
1616
}
1717
}
1818

1919
func (p *Project) Schema() sql.Schema {
2020
var s sql.Schema
21-
for _, e := range p.expressions {
21+
for _, e := range p.Expressions {
2222
f := sql.Field{
2323
Name: e.Name(),
2424
Type: e.Type(),
@@ -33,7 +33,7 @@ func (p *Project) Resolved() bool {
3333
}
3434

3535
func (p *Project) expressionsResolved() bool {
36-
for _, e := range p.expressions {
36+
for _, e := range p.Expressions {
3737
if !e.Resolved() {
3838
return false
3939
}
@@ -51,15 +51,15 @@ func (p *Project) RowIter() (sql.RowIter, error) {
5151

5252
func (p *Project) TransformUp(f func(sql.Node) sql.Node) sql.Node {
5353
c := p.UnaryNode.Child.TransformUp(f)
54-
n := NewProject(p.expressions, c)
54+
n := NewProject(p.Expressions, c)
5555

5656
return f(n)
5757
}
5858

5959
func (p *Project) TransformExpressionsUp(f func(sql.Expression) sql.Expression) sql.Node {
6060
c := p.UnaryNode.Child.TransformExpressionsUp(f)
6161
es := []sql.Expression{}
62-
for _, e := range p.expressions {
62+
for _, e := range p.Expressions {
6363
te := e.TransformUp(f)
6464
es = append(es, te)
6565
}
@@ -78,7 +78,7 @@ func (i *iter) Next() (sql.Row, error) {
7878
if err != nil {
7979
return nil, err
8080
}
81-
return filterRow(i.p.expressions, childRow), nil
81+
return filterRow(i.p.Expressions, childRow), nil
8282
}
8383

8484
func filterRow(expressions []sql.Expression, row sql.Row) sql.Row {

0 commit comments

Comments
 (0)