Skip to content

Commit a9502cd

Browse files
authored
parser: Attach range vars to insert params (#342)
* parser: Attach range vars to insert params Also process CTEs for insert statements
2 parents 2573a11 + e427835 commit a9502cd

File tree

6 files changed

+177
-5
lines changed

6 files changed

+177
-5
lines changed

internal/dinosql/parser.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -695,6 +695,8 @@ type QueryCatalog struct {
695695
func buildQueryCatalog(c core.Catalog, node nodes.Node) (*QueryCatalog, error) {
696696
var with *nodes.WithClause
697697
switch n := node.(type) {
698+
case nodes.InsertStmt:
699+
with = n.WithClause
698700
case nodes.UpdateStmt:
699701
with = n.WithClause
700702
case nodes.SelectStmt:
@@ -829,8 +831,6 @@ func outputColumns(qc *QueryCatalog, node nodes.Node) ([]core.Column, error) {
829831
var cols []core.Column
830832

831833
for _, target := range targets.Items {
832-
// spew.Dump(target)
833-
834834
res, ok := target.(nodes.ResTarget)
835835
if !ok {
836836
continue
@@ -1088,7 +1088,7 @@ func (p paramSearch) Visit(node nodes.Node) ast.Visitor {
10881088
continue
10891089
}
10901090
// TODO: Out-of-bounds panic
1091-
*p.refs = append(*p.refs, paramRef{parent: n.Cols.Items[i], ref: ref, rv: p.rangeVar})
1091+
*p.refs = append(*p.refs, paramRef{parent: n.Cols.Items[i], ref: ref, rv: n.Relation})
10921092
p.seen[ref.Location] = struct{}{}
10931093
}
10941094
for _, vl := range s.ValuesLists {
@@ -1098,7 +1098,7 @@ func (p paramSearch) Visit(node nodes.Node) ast.Visitor {
10981098
continue
10991099
}
11001100
// TODO: Out-of-bounds panic
1101-
*p.refs = append(*p.refs, paramRef{parent: n.Cols.Items[i], ref: ref, rv: p.rangeVar})
1101+
*p.refs = append(*p.refs, paramRef{parent: n.Cols.Items[i], ref: ref, rv: n.Relation})
11021102
p.seen[ref.Location] = struct{}{}
11031103
}
11041104
}
@@ -1403,7 +1403,19 @@ func resolveCatalogRefs(c core.Catalog, rvs []nodes.RangeVar, args []paramRef, n
14031403
return nil, fmt.Errorf("nodes.ResTarget has nil name")
14041404
}
14051405
key := *n.Name
1406-
if c, ok := typeMap[defaultTable.Schema][defaultTable.Rel][key]; ok {
1406+
1407+
// TODO: Deprecate defaultTable
1408+
schema := defaultTable.Schema
1409+
rel := defaultTable.Rel
1410+
if ref.rv != nil {
1411+
fqn, err := catalog.ParseRange(ref.rv)
1412+
if err != nil {
1413+
return nil, err
1414+
}
1415+
schema = fqn.Schema
1416+
rel = fqn.Rel
1417+
}
1418+
if c, ok := typeMap[schema][rel][key]; ok {
14071419
a = append(a, Parameter{
14081420
Number: ref.ref.Number,
14091421
Column: core.Column{

internal/endtoend/testdata/insert_cte/go/db.go

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

internal/endtoend/testdata/insert_cte/go/models.go

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

internal/endtoend/testdata/insert_cte/go/query.sql.go

Lines changed: 51 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
-- FILE: schema.sql
2+
3+
DROP SCHEMA IF EXISTS td3 CASCADE;
4+
CREATE SCHEMA td3;
5+
6+
CREATE TABLE td3.codes (
7+
id SERIAL PRIMARY KEY,
8+
ts_created timestamptz DEFAULT now() NOT NULL,
9+
ts_updated timestamptz DEFAULT now() NOT NULL,
10+
created_by text NOT NULL,
11+
updated_by text NOT NULL,
12+
13+
code text,
14+
hash text,
15+
is_private boolean
16+
);
17+
18+
19+
CREATE TABLE td3.test_codes (
20+
id SERIAL PRIMARY KEY,
21+
ts_created timestamptz DEFAULT now() NOT NULL,
22+
ts_updated timestamptz DEFAULT now() NOT NULL,
23+
created_by text NOT NULL,
24+
updated_by text NOT NULL,
25+
26+
test_id integer NOT NULL,
27+
code_hash text NOT NULL
28+
);
29+
30+
-- FILE: query.sql
31+
32+
-- name: InsertCode :one
33+
WITH cc AS (
34+
INSERT INTO td3.codes(created_by, updated_by, code, hash, is_private)
35+
VALUES ($1, $1, $2, $3, false)
36+
RETURNING hash
37+
)
38+
INSERT INTO td3.test_codes(created_by, updated_by, test_id, code_hash)
39+
VALUES(
40+
$1, $1, $4, (select hash from cc)
41+
)
42+
RETURNING *;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"version": "1",
3+
"packages": [{
4+
"path": "go",
5+
"name": "querytest",
6+
"schema": "query.sql",
7+
"queries": "query.sql"
8+
}]
9+
}

0 commit comments

Comments
 (0)