Skip to content

Commit 4d764a2

Browse files
feat: Parse comment lines starting with @symbol as boolean flags associated with a query (#2464)
1 parent d12db53 commit 4d764a2

File tree

4 files changed

+48
-6
lines changed

4 files changed

+48
-6
lines changed

internal/compiler/parse.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func (c *Compiler) parseQuery(stmt ast.Node, src string, o opts.Parser) (*Query,
7070
if err := validate.In(c.catalog, raw); err != nil {
7171
return nil, err
7272
}
73-
name, cmd, err := metadata.Parse(strings.TrimSpace(rawSQL), c.parser.CommentSyntax())
73+
name, cmd, err := metadata.ParseQueryNameAndType(strings.TrimSpace(rawSQL), c.parser.CommentSyntax())
7474
if err != nil {
7575
return nil, err
7676
}
@@ -125,11 +125,18 @@ func (c *Compiler) parseQuery(stmt ast.Node, src string, o opts.Parser) (*Query,
125125
if err != nil {
126126
return nil, err
127127
}
128+
129+
flags, err := metadata.ParseQueryFlags(comments)
130+
if err != nil {
131+
return nil, err
132+
}
133+
128134
return &Query{
129135
RawStmt: raw,
130136
Cmd: cmd,
131137
Comments: comments,
132138
Name: name,
139+
Flags: flags,
133140
Params: params,
134141
Columns: cols,
135142
SQL: trimmed,

internal/compiler/query.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ type Query struct {
4242
SQL string
4343
Name string
4444
Cmd string // TODO: Pick a better name. One of: one, many, exec, execrows, copyFrom
45+
Flags map[string]bool
4546
Columns []*Column
4647
Params []Parameter
4748
Comments []string

internal/metadata/meta.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func validateQueryName(name string) error {
4444
return nil
4545
}
4646

47-
func Parse(t string, commentStyle CommentSyntax) (string, string, error) {
47+
func ParseQueryNameAndType(t string, commentStyle CommentSyntax) (string, string, error) {
4848
for _, line := range strings.Split(t, "\n") {
4949
var prefix string
5050
if strings.HasPrefix(line, "--") {
@@ -103,3 +103,19 @@ func Parse(t string, commentStyle CommentSyntax) (string, string, error) {
103103
}
104104
return "", "", nil
105105
}
106+
107+
func ParseQueryFlags(comments []string) (map[string]bool, error) {
108+
flags := make(map[string]bool)
109+
for _, line := range comments {
110+
cleanLine := strings.TrimPrefix(line, "--")
111+
cleanLine = strings.TrimPrefix(cleanLine, "/*")
112+
cleanLine = strings.TrimPrefix(cleanLine, "#")
113+
cleanLine = strings.TrimSuffix(cleanLine, "*/")
114+
cleanLine = strings.TrimSpace(cleanLine)
115+
if strings.HasPrefix(cleanLine, "@") {
116+
flagName := strings.SplitN(cleanLine, " ", 2)[0]
117+
flags[flagName] = true
118+
}
119+
}
120+
return flags, nil
121+
}

internal/metadata/meta_test.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package metadata
22

33
import "testing"
44

5-
func TestParseMetadata(t *testing.T) {
5+
func TestParseQueryNameAndType(t *testing.T) {
66

77
for _, query := range []string{
88
`-- name: CreateFoo, :one`,
@@ -17,7 +17,7 @@ func TestParseMetadata(t *testing.T) {
1717
"-- name:CreateFoo",
1818
`--name:CreateFoo :two`,
1919
} {
20-
if _, _, err := Parse(query, CommentSyntax{Dash: true}); err == nil {
20+
if _, _, err := ParseQueryNameAndType(query, CommentSyntax{Dash: true}); err == nil {
2121
t.Errorf("expected invalid metadata: %q", query)
2222
}
2323
}
@@ -27,13 +27,13 @@ func TestParseMetadata(t *testing.T) {
2727
`-- name comment`,
2828
`--name comment`,
2929
} {
30-
if _, _, err := Parse(query, CommentSyntax{Dash: true}); err != nil {
30+
if _, _, err := ParseQueryNameAndType(query, CommentSyntax{Dash: true}); err != nil {
3131
t.Errorf("expected valid comment: %q", query)
3232
}
3333
}
3434

3535
query := `-- name: CreateFoo :one`
36-
queryName, queryType, err := Parse(query, CommentSyntax{Dash: true})
36+
queryName, queryType, err := ParseQueryNameAndType(query, CommentSyntax{Dash: true})
3737
if err != nil {
3838
t.Errorf("expected valid metadata: %q", query)
3939
}
@@ -45,3 +45,21 @@ func TestParseMetadata(t *testing.T) {
4545
}
4646

4747
}
48+
49+
func TestParseQueryFlags(t *testing.T) {
50+
for _, comments := range [][]string{
51+
{
52+
"-- name: CreateFoo :one",
53+
"-- @flag-foo",
54+
},
55+
} {
56+
flags, err := ParseQueryFlags(comments)
57+
if err != nil {
58+
t.Errorf("expected query flags to parse, got error: %s", err)
59+
}
60+
61+
if !flags["@flag-foo"] {
62+
t.Errorf("expected flag not found")
63+
}
64+
}
65+
}

0 commit comments

Comments
 (0)