Skip to content

Commit 7c18712

Browse files
committed
Allow for DDL and unsupported statements as a query
By adding 'no-inference' to your query comment, sqlc won't try to understand your query. (The dolphin/postgresql parser still need to understand your syntax.) This means that params and output columns don't work, but you can run any query you want.
1 parent 531e214 commit 7c18712

File tree

7 files changed

+106
-15
lines changed

7 files changed

+106
-15
lines changed

internal/compiler/parse.go

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,43 @@ func (c *Compiler) parseQuery(stmt ast.Node, src string, o opts.Parser) (*Query,
2323
if o.Debug.DumpAST {
2424
debug.Dump(stmt)
2525
}
26+
raw, ok := stmt.(*ast.RawStmt)
27+
if !ok {
28+
return nil, errors.New("node is not a statement")
29+
}
30+
rawSQL, err := source.Pluck(src, raw.StmtLocation, raw.StmtLen)
31+
if err != nil {
32+
return nil, err
33+
}
34+
if rawSQL == "" {
35+
return nil, errors.New("missing semicolon at end of file")
36+
}
37+
name, cmd, cmdParams, err := metadata.Parse(strings.TrimSpace(rawSQL), c.parser.CommentSyntax())
38+
if err != nil {
39+
return nil, err
40+
}
41+
if cmdParams.NoInference {
42+
trimmed, comments, err := source.StripComments(rawSQL)
43+
if err != nil {
44+
return nil, err
45+
}
46+
return &Query{
47+
Cmd: cmd,
48+
Comments: comments,
49+
Name: name,
50+
Params: nil,
51+
Columns: nil,
52+
SQL: trimmed,
53+
CmdParams: cmdParams,
54+
}, nil
55+
}
2656
if err := validate.ParamStyle(stmt); err != nil {
2757
return nil, err
2858
}
2959
numbers, dollar, err := validate.ParamRef(stmt)
3060
if err != nil {
3161
return nil, err
3262
}
33-
raw, ok := stmt.(*ast.RawStmt)
34-
if !ok {
35-
return nil, errors.New("node is not a statement")
36-
}
3763
var table *ast.TableName
3864
switch n := raw.Stmt.(type) {
3965
case *ast.CallStmt:
@@ -57,23 +83,12 @@ func (c *Compiler) parseQuery(stmt ast.Node, src string, o opts.Parser) (*Query,
5783
return nil, ErrUnsupportedStatementType
5884
}
5985

60-
rawSQL, err := source.Pluck(src, raw.StmtLocation, raw.StmtLen)
61-
if err != nil {
62-
return nil, err
63-
}
64-
if rawSQL == "" {
65-
return nil, errors.New("missing semicolon at end of file")
66-
}
6786
if err := validate.FuncCall(c.catalog, c.combo, raw); err != nil {
6887
return nil, err
6988
}
7089
if err := validate.In(c.catalog, raw); err != nil {
7190
return nil, err
7291
}
73-
name, cmd, cmdParams, err := metadata.Parse(strings.TrimSpace(rawSQL), c.parser.CommentSyntax())
74-
if err != nil {
75-
return nil, err
76-
}
7792
raw, namedParams, edits := rewrite.NamedParameters(c.conf.Engine, raw, numbers, dollar)
7893
if err := validate.Cmd(raw.Stmt, name, cmd); err != nil {
7994
return nil, err

internal/endtoend/testdata/no_inference/postgresql/go/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/no_inference/postgresql/go/models.go

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

internal/endtoend/testdata/no_inference/postgresql/go/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: CreateTempTable :exec no-inference
2+
CREATE TEMPORARY TABLE bar (LIKE foo);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
CREATE TABLE foo (val text not null);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"engine": "postgresql",
6+
"path": "go",
7+
"name": "querytest",
8+
"schema": "schema.sql",
9+
"queries": "query.sql"
10+
}
11+
]
12+
}

0 commit comments

Comments
 (0)