Skip to content

Commit 8badfc5

Browse files
committed
Let's crush some bugs
1 parent 62f395b commit 8badfc5

File tree

19 files changed

+275
-427
lines changed

19 files changed

+275
-427
lines changed

internal/cmd/generate.go

Lines changed: 27 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,7 @@ func (d *dinosqlEngine) Result() golang.Generateable {
209209
}
210210

211211
func parse(e Env, name, dir string, sql config.SQL, combo config.CombinedSettings, parserOpts dinosql.ParserOpts, stderr io.Writer) (golang.Generateable, bool) {
212-
switch sql.Engine {
213-
case config.EngineMySQL:
212+
if sql.Engine == config.EngineMySQL && !e.ExperimentalParser {
214213
// Experimental MySQL support
215214
q, err := mysql.GeneratePkg(name, sql.Schema, sql.Queries, combo)
216215
if err != nil {
@@ -225,48 +224,36 @@ func parse(e Env, name, dir string, sql config.SQL, combo config.CombinedSetting
225224
return nil, true
226225
}
227226
return q, false
227+
}
228228

229-
case config.EnginePostgreSQL, config.EngineXLemon:
230-
var eng postgreEngine
231-
if e.ExperimentalParser || sql.Engine == config.EngineXLemon {
232-
eng = compiler.NewEngine(sql, combo)
233-
} else {
234-
eng = &dinosqlEngine{}
235-
}
236-
if err := eng.ParseCatalog(sql.Schema); err != nil {
237-
fmt.Fprintf(stderr, "# package %s\n", name)
238-
if parserErr, ok := err.(*multierr.Error); ok {
239-
for _, fileErr := range parserErr.Errs() {
240-
printFileErr(stderr, dir, fileErr)
241-
}
242-
} else {
243-
fmt.Fprintf(stderr, "error parsing schema: %s\n", err)
229+
var eng postgreEngine
230+
if sql.Engine == config.EnginePostgreSQL && !e.ExperimentalParser {
231+
eng = &dinosqlEngine{}
232+
} else {
233+
eng = compiler.NewEngine(sql, combo)
234+
}
235+
236+
if err := eng.ParseCatalog(sql.Schema); err != nil {
237+
fmt.Fprintf(stderr, "# package %s\n", name)
238+
if parserErr, ok := err.(*multierr.Error); ok {
239+
for _, fileErr := range parserErr.Errs() {
240+
printFileErr(stderr, dir, fileErr)
244241
}
245-
return nil, true
242+
} else {
243+
fmt.Fprintf(stderr, "error parsing schema: %s\n", err)
246244
}
247-
if err := eng.ParseQueries(sql.Queries, parserOpts); err != nil {
248-
fmt.Fprintf(stderr, "# package %s\n", name)
249-
if parserErr, ok := err.(*multierr.Error); ok {
250-
for _, fileErr := range parserErr.Errs() {
251-
printFileErr(stderr, dir, fileErr)
252-
}
253-
} else {
254-
fmt.Fprintf(stderr, "error parsing queries: %s\n", err)
245+
return nil, true
246+
}
247+
if err := eng.ParseQueries(sql.Queries, parserOpts); err != nil {
248+
fmt.Fprintf(stderr, "# package %s\n", name)
249+
if parserErr, ok := err.(*multierr.Error); ok {
250+
for _, fileErr := range parserErr.Errs() {
251+
printFileErr(stderr, dir, fileErr)
255252
}
256-
return nil, true
257-
}
258-
return eng.Result(), false
259-
260-
case config.EngineXDolphin, config.EngineXElephant:
261-
r, err := compiler.Run(sql, combo)
262-
if err != nil {
263-
fmt.Fprintf(stderr, "# package %s\n", name)
264-
fmt.Fprintf(stderr, "error: %s\n", err)
265-
return nil, true
253+
} else {
254+
fmt.Fprintf(stderr, "error parsing queries: %s\n", err)
266255
}
267-
return r, false
268-
269-
default:
270-
panic("invalid engine")
256+
return nil, true
271257
}
258+
return eng.Result(), false
272259
}

internal/compiler/compile.go

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,13 @@ import (
1111
"strings"
1212

1313
"github.com/kyleconroy/sqlc/internal/codegen/golang"
14-
"github.com/kyleconroy/sqlc/internal/config"
15-
"github.com/kyleconroy/sqlc/internal/dolphin"
1614
"github.com/kyleconroy/sqlc/internal/migrations"
1715
"github.com/kyleconroy/sqlc/internal/multierr"
1816
"github.com/kyleconroy/sqlc/internal/pg"
19-
"github.com/kyleconroy/sqlc/internal/postgresql"
2017
"github.com/kyleconroy/sqlc/internal/sql/ast"
2118
"github.com/kyleconroy/sqlc/internal/sql/catalog"
2219
"github.com/kyleconroy/sqlc/internal/sql/sqlerr"
2320
"github.com/kyleconroy/sqlc/internal/sql/sqlpath"
24-
"github.com/kyleconroy/sqlc/internal/sqlite"
2521
)
2622

2723
type Parser interface {
@@ -199,28 +195,3 @@ func buildResult(c *catalog.Catalog) (*BuildResult, error) {
199195
}
200196
return &BuildResult{structs: structs, enums: enums}, nil
201197
}
202-
203-
func Run(conf config.SQL, combo config.CombinedSettings) (*BuildResult, error) {
204-
var c *catalog.Catalog
205-
var p Parser
206-
207-
switch conf.Engine {
208-
case config.EngineXLemon:
209-
p = sqlite.NewParser()
210-
c = catalog.New("main")
211-
case config.EngineXDolphin:
212-
p = dolphin.NewParser()
213-
c = catalog.New("public") // TODO: What is the default database for MySQL?
214-
case config.EngineXElephant:
215-
p = postgresql.NewParser()
216-
c = postgresql.NewCatalog()
217-
default:
218-
return nil, fmt.Errorf("unknown engine: %s", conf.Engine)
219-
}
220-
221-
if err := parseCatalog(p, c, conf.Schema); err != nil {
222-
return nil, err
223-
}
224-
225-
return buildResult(c)
226-
}

internal/compiler/engine.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ func NewEngine(conf config.SQL, combo config.CombinedSettings) *Engine {
2828
case config.EngineXLemon:
2929
e.parser = sqlite.NewParser()
3030
e.catalog = catalog.New("main")
31-
case config.EngineXDolphin:
31+
case config.EngineMySQL:
3232
e.parser = dolphin.NewParser()
3333
e.catalog = catalog.New("public") // TODO: What is the default database for MySQL?
34-
case config.EngineXElephant, config.EnginePostgreSQL:
34+
case config.EnginePostgreSQL:
3535
e.parser = postgresql.NewParser()
3636
e.catalog = postgresql.NewCatalog()
3737
default:

internal/config/config.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,7 @@ const (
7474
EnginePostgreSQL Engine = "postgresql"
7575

7676
// Experimental engines
77-
EngineXLemon Engine = "_lemon"
78-
EngineXDolphin Engine = "_dolphin"
79-
EngineXElephant Engine = "_elephant"
77+
EngineXLemon Engine = "_lemon"
8078
)
8179

8280
type Config struct {

internal/dolphin/convert.go

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package dolphin
2+
3+
import (
4+
pcast "github.com/pingcap/parser/ast"
5+
6+
"github.com/kyleconroy/sqlc/internal/sql/ast"
7+
)
8+
9+
func convertAlterTableStmt(n *pcast.AlterTableStmt) ast.Node {
10+
alt := &ast.AlterTableStmt{
11+
Table: parseTableName(n.Table),
12+
Cmds: &ast.List{},
13+
}
14+
for _, spec := range n.Specs {
15+
switch spec.Tp {
16+
case pcast.AlterTableAddColumns:
17+
for _, def := range spec.NewColumns {
18+
name := def.Name.String()
19+
alt.Cmds.Items = append(alt.Cmds.Items, &ast.AlterTableCmd{
20+
Name: &name,
21+
Subtype: ast.AT_AddColumn,
22+
Def: &ast.ColumnDef{
23+
Colname: def.Name.String(),
24+
// TODO: Use def.Tp to generate type name
25+
TypeName: &ast.TypeName{Name: "text"},
26+
},
27+
})
28+
}
29+
30+
case pcast.AlterTableDropColumn:
31+
name := spec.OldColumnName.String()
32+
alt.Cmds.Items = append(alt.Cmds.Items, &ast.AlterTableCmd{
33+
Name: &name,
34+
Subtype: ast.AT_DropColumn,
35+
// MissingOk: spec.IfExists,
36+
})
37+
38+
case pcast.AlterTableChangeColumn:
39+
// spew.Dump("change column", spec)
40+
41+
case pcast.AlterTableModifyColumn:
42+
// spew.Dump("modify column", spec)
43+
44+
case pcast.AlterTableAlterColumn:
45+
// spew.Dump("alter column", spec)
46+
47+
case pcast.AlterTableAddConstraint:
48+
// spew.Dump("add const", spec)
49+
50+
default:
51+
continue
52+
}
53+
}
54+
return alt
55+
}
56+
57+
func convertCreateTableStmt(n *pcast.CreateTableStmt) ast.Node {
58+
create := &ast.CreateTableStmt{
59+
Name: parseTableName(n.Table),
60+
IfNotExists: n.IfNotExists,
61+
}
62+
for _, def := range n.Cols {
63+
create.Cols = append(create.Cols, &ast.ColumnDef{
64+
Colname: def.Name.String(),
65+
// TODO: Use n.Tp to generate type name
66+
TypeName: &ast.TypeName{Name: "text"},
67+
})
68+
}
69+
return create
70+
}
71+
72+
func convertDropTableStmt(n *pcast.DropTableStmt) ast.Node {
73+
drop := &ast.DropTableStmt{IfExists: n.IfExists}
74+
for _, name := range n.Tables {
75+
drop.Tables = append(drop.Tables, parseTableName(name))
76+
}
77+
return drop
78+
}
79+
80+
func convertSelectStmt(n *pcast.SelectStmt) ast.Node {
81+
sel := &ast.SelectStmt{}
82+
var tables []ast.Node
83+
visit(n.From, func(n pcast.Node) {
84+
name, ok := n.(*pcast.TableName)
85+
if !ok {
86+
return
87+
}
88+
tables = append(tables, parseTableName(name))
89+
})
90+
var cols []ast.Node
91+
visit(n.Fields, func(n pcast.Node) {
92+
col, ok := n.(*pcast.ColumnName)
93+
if !ok {
94+
return
95+
}
96+
cols = append(cols, &ast.ResTarget{
97+
Val: &ast.ColumnRef{
98+
Name: col.Name.String(),
99+
},
100+
})
101+
})
102+
sel.From = &ast.List{Items: tables}
103+
sel.Fields = &ast.List{Items: cols}
104+
return sel
105+
}
106+
107+
func convert(node pcast.Node) ast.Node {
108+
switch n := node.(type) {
109+
110+
case *pcast.AlterTableStmt:
111+
return convertAlterTableStmt(n)
112+
113+
case *pcast.CreateTableStmt:
114+
return convertCreateTableStmt(n)
115+
116+
case *pcast.DropTableStmt:
117+
return convertDropTableStmt(n)
118+
119+
case *pcast.SelectStmt:
120+
return convertSelectStmt(n)
121+
122+
default:
123+
return &ast.TODO{}
124+
}
125+
}

0 commit comments

Comments
 (0)