Skip to content

Commit 55f3250

Browse files
feat(analyzer): Return zero values when encountering unexpected ast nodes (#3069)
This allows users to run generate on any parseable query, even when sqlc doesn't understand it. Closes #2377
1 parent 58f7316 commit 55f3250

24 files changed

+210
-47
lines changed

internal/compiler/analyze.go

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -135,10 +135,6 @@ func (c *Compiler) _analyzeQuery(raw *ast.RawStmt, query string, failfast bool)
135135

136136
var table *ast.TableName
137137
switch n := raw.Stmt.(type) {
138-
case *ast.CallStmt:
139-
case *ast.SelectStmt:
140-
case *ast.DeleteStmt:
141-
case *ast.DoStmt:
142138
case *ast.InsertStmt:
143139
if err := check(validate.InsertStmt(n)); err != nil {
144140
return nil, err
@@ -148,15 +144,6 @@ func (c *Compiler) _analyzeQuery(raw *ast.RawStmt, query string, failfast bool)
148144
if err := check(err); err != nil {
149145
return nil, err
150146
}
151-
case *ast.ListenStmt:
152-
case *ast.NotifyStmt:
153-
case *ast.TruncateStmt:
154-
case *ast.UpdateStmt:
155-
case *ast.RefreshMatViewStmt:
156-
default:
157-
if err := check(ErrUnsupportedStatementType); err != nil {
158-
return nil, err
159-
}
160147
}
161148

162149
if err := check(validate.FuncCall(c.catalog, c.combo, raw)); err != nil {

internal/compiler/compile.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,6 @@ func (c *Compiler) parseQueries(o opts.Parser) (*Result, error) {
7979
}
8080
for _, stmt := range stmts {
8181
query, err := c.parseQuery(stmt.Raw, src, o)
82-
if err == ErrUnsupportedStatementType {
83-
continue
84-
}
8582
if err != nil {
8683
var e *sqlerr.Error
8784
loc := stmt.Raw.Pos()
@@ -95,6 +92,10 @@ func (c *Compiler) parseQueries(o opts.Parser) (*Result, error) {
9592
}
9693
continue
9794
}
95+
if query == nil {
96+
continue
97+
}
98+
query.Metadata.Filename = filepath.Base(filename)
9899
queryName := query.Metadata.Name
99100
if queryName != "" {
100101
if _, exists := set[queryName]; exists {
@@ -103,10 +104,7 @@ func (c *Compiler) parseQueries(o opts.Parser) (*Result, error) {
103104
}
104105
set[queryName] = struct{}{}
105106
}
106-
query.Metadata.Filename = filepath.Base(filename)
107-
if query != nil {
108-
q = append(q, query)
109-
}
107+
q = append(q, query)
110108
}
111109
}
112110
if len(merr.Errs()) > 0 {

internal/compiler/output_columns.go

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func (c *Compiler) outputColumns(qc *QueryCatalog, node ast.Node) ([]*Column, er
5757
return nil, err
5858
}
5959

60-
var targets *ast.List
60+
targets := &ast.List{}
6161
switch n := node.(type) {
6262
case *ast.DeleteStmt:
6363
targets = n.ReturningList
@@ -114,16 +114,8 @@ func (c *Compiler) outputColumns(qc *QueryCatalog, node ast.Node) ([]*Column, er
114114
if isUnion {
115115
return c.outputColumns(qc, n.Larg)
116116
}
117-
case *ast.DoStmt:
118-
targets = &ast.List{}
119-
case *ast.CallStmt:
120-
targets = &ast.List{}
121-
case *ast.TruncateStmt, *ast.RefreshMatViewStmt, *ast.NotifyStmt, *ast.ListenStmt:
122-
targets = &ast.List{}
123117
case *ast.UpdateStmt:
124118
targets = n.ReturningList
125-
default:
126-
return nil, fmt.Errorf("outputColumns: unsupported node type: %T", n)
127119
}
128120

129121
var cols []*Column
@@ -487,7 +479,7 @@ func (r *tableVisitor) Visit(n ast.Node) astutils.Visitor {
487479
// Return an error if a table is referenced twice
488480
// Return an error if an unknown column is referenced
489481
func (c *Compiler) sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, error) {
490-
var list *ast.List
482+
list := &ast.List{}
491483
switch n := node.(type) {
492484
case *ast.DeleteStmt:
493485
list = n.Relations
@@ -514,14 +506,6 @@ func (c *Compiler) sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, erro
514506
astutils.Walk(&tv, n.FromClause)
515507
astutils.Walk(&tv, n.Relations)
516508
list = &tv.list
517-
case *ast.DoStmt:
518-
list = &ast.List{}
519-
case *ast.CallStmt:
520-
list = &ast.List{}
521-
case *ast.NotifyStmt, *ast.ListenStmt:
522-
list = &ast.List{}
523-
default:
524-
return nil, fmt.Errorf("sourceTables: unsupported node type: %T", n)
525509
}
526510

527511
var tables []*Table

internal/compiler/parse.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ import (
1515
"github.com/sqlc-dev/sqlc/internal/sql/validate"
1616
)
1717

18-
var ErrUnsupportedStatementType = errors.New("parseQuery: unsupported statement type")
19-
2018
func (c *Compiler) parseQuery(stmt ast.Node, src string, o opts.Parser) (*Query, error) {
2119
ctx := context.Background()
2220

internal/endtoend/testdata/exec_create_table/mysql/db/db.go

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/exec_create_table/mysql/db/models.go

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/exec_create_table/mysql/db/mysql.query.sql.go

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- name: CreateTable :exec
2+
CREATE TABLE test (id INTEGER NOT NULL);

internal/endtoend/testdata/exec_create_table/mysql/mysql.schema.sql

Whitespace-only changes.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
version: 2
2+
sql:
3+
- queries: mysql.query.sql
4+
schema: mysql.schema.sql
5+
engine: mysql
6+
gen:
7+
go:
8+
out: db

internal/endtoend/testdata/exec_create_table/postgresql/db/db.go

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/exec_create_table/postgresql/db/models.go

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/exec_create_table/postgresql/db/postgresql.query.sql.go

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- name: CreateTable :exec
2+
CREATE TABLE test (id INTEGER NOT NULL);

internal/endtoend/testdata/exec_create_table/postgresql/postgresql.schema.sql

Whitespace-only changes.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
version: 2
2+
sql:
3+
- queries: postgresql.query.sql
4+
schema: postgresql.schema.sql
5+
engine: postgresql
6+
gen:
7+
go:
8+
out: db
9+

internal/endtoend/testdata/exec_create_table/sqlite/db/db.go

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/exec_create_table/sqlite/db/models.go

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/exec_create_table/sqlite/db/sqlite.query.sql.go

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
version: 2
2+
sql:
3+
- queries: sqlite.query.sql
4+
schema: sqlite.schema.sql
5+
engine: sqlite
6+
gen:
7+
go:
8+
out: db
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- name: CreateTable :exec
2+
CREATE TABLE test (id INTEGER NOT NULL);

internal/endtoend/testdata/exec_create_table/sqlite/sqlite.schema.sql

Whitespace-only changes.

internal/endtoend/testdata/vet_failures/query.sql

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
1-
CREATE TABLE authors (
2-
id BIGSERIAL PRIMARY KEY,
3-
name text NOT NULL,
4-
bio text
5-
);
6-
71
-- name: GetAuthor :one
82
SELECT * FROM authors
93
WHERE id = $1 LIMIT 1;

internal/endtoend/testdata/vet_failures/sqlc.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
version: 2
22
sql:
3-
- schema: "query.sql"
3+
- schema: "schema.sql"
44
queries: "query.sql"
55
engine: "postgresql"
66
gen:

0 commit comments

Comments
 (0)