Skip to content

Commit c0fdb5b

Browse files
authored
cmd: Add debugging support (sqlc-dev#573)
The SQLCDEBUG environment variable can be used to control dumping AST nodes to stdout.
1 parent b4fac24 commit c0fdb5b

File tree

7 files changed

+57
-4
lines changed

7 files changed

+57
-4
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.14
44

55
require (
66
github.com/antlr/antlr4 v0.0.0-20200209180723-1177c0b58d07
7+
github.com/davecgh/go-spew v1.1.1
78
github.com/google/go-cmp v0.4.0
89
github.com/jinzhu/inflection v1.0.0
910
github.com/lfittl/pg_query_go v1.0.0

internal/cmd/generate.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,12 @@ func Generate(e Env, dir string, stderr io.Writer) (map[string]string, error) {
9191
return nil, err
9292
}
9393

94+
debug, err := opts.DebugFromEnv()
95+
if err != nil {
96+
fmt.Fprintf(stderr, "error parsing SQLCDEBUG: %s\n", err)
97+
return nil, err
98+
}
99+
94100
output := map[string]string{}
95101
errored := false
96102

@@ -127,7 +133,9 @@ func Generate(e Env, dir string, stderr io.Writer) (map[string]string, error) {
127133
sql.Queries = joined
128134

129135
var name string
130-
parseOpts := opts.Parser{}
136+
parseOpts := opts.Parser{
137+
Debug: debug,
138+
}
131139
if sql.Gen.Go != nil {
132140
name = combo.Go.Package
133141
} else if sql.Gen.Kotlin != nil {

internal/compiler/compile.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func parseQueries(p Parser, c *catalog.Catalog, queries []string, o opts.Parser)
104104
continue
105105
}
106106
for _, stmt := range stmts {
107-
query, err := parseQuery(p, c, stmt.Raw, src, o.UsePositionalParameters)
107+
query, err := parseQuery(p, c, stmt.Raw, src, o)
108108
if err == ErrUnsupportedStatementType {
109109
continue
110110
}

internal/compiler/parse.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import (
66
"sort"
77
"strings"
88

9+
"github.com/kyleconroy/sqlc/internal/debug"
910
"github.com/kyleconroy/sqlc/internal/metadata"
11+
"github.com/kyleconroy/sqlc/internal/opts"
1012
"github.com/kyleconroy/sqlc/internal/source"
1113
"github.com/kyleconroy/sqlc/internal/sql/ast"
1214
"github.com/kyleconroy/sqlc/internal/sql/ast/pg"
@@ -30,7 +32,10 @@ func rewriteNumberedParameters(refs []paramRef, raw *ast.RawStmt, sql string) ([
3032
return edits, nil
3133
}
3234

33-
func parseQuery(p Parser, c *catalog.Catalog, stmt ast.Node, src string, rewriteParameters bool) (*Query, error) {
35+
func parseQuery(p Parser, c *catalog.Catalog, stmt ast.Node, src string, o opts.Parser) (*Query, error) {
36+
if o.Debug.DumpAST {
37+
debug.Dump(stmt)
38+
}
3439
if err := validate.ParamStyle(stmt); err != nil {
3540
return nil, err
3641
}
@@ -75,7 +80,7 @@ func parseQuery(p Parser, c *catalog.Catalog, stmt ast.Node, src string, rewrite
7580
raw, namedParams, edits := rewrite.NamedParameters(raw)
7681
rvs := rangeVars(raw.Stmt)
7782
refs := findParameters(raw.Stmt)
78-
if rewriteParameters {
83+
if o.UsePositionalParameters {
7984
edits, err = rewriteNumberedParameters(refs, raw, rawSQL)
8085
if err != nil {
8186
return nil, err

internal/debug/dump.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package debug
2+
3+
import (
4+
"github.com/davecgh/go-spew/spew"
5+
)
6+
7+
func Dump(n interface{}) {
8+
spew.Dump(n)
9+
}

internal/opts/debug.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package opts
2+
3+
import (
4+
"os"
5+
"strings"
6+
)
7+
8+
// The SQLCDEBUG variable controls debugging variables within the runtime. It
9+
// is a comma-separated list of name=val pairs setting these named variables:
10+
//
11+
// dumpast: setting dumpast=1 will print the AST of every SQL statement
12+
13+
type Debug struct {
14+
DumpAST bool
15+
}
16+
17+
func DebugFromEnv() (Debug, error) {
18+
d := Debug{}
19+
val := os.Getenv("SQLCDEBUG")
20+
if val == "" {
21+
return d, nil
22+
}
23+
for _, pair := range strings.Split(val, ",") {
24+
if pair == "dumpast=1" {
25+
d.DumpAST = true
26+
}
27+
}
28+
return d, nil
29+
}

internal/opts/parser.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ package opts
22

33
type Parser struct {
44
UsePositionalParameters bool
5+
Debug Debug
56
}

0 commit comments

Comments
 (0)