Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 24 additions & 5 deletions internal/compiler/find_params.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
package compiler

import (
"fmt"

"github.com/kyleconroy/sqlc/internal/sql/ast"
"github.com/kyleconroy/sqlc/internal/sql/astutils"
)

func findParameters(root ast.Node) []paramRef {
func findParameters(root ast.Node) ([]paramRef, error) {
refs := make([]paramRef, 0)
v := paramSearch{seen: make(map[int]struct{}), refs: &refs}
errors := make([]error, 0)
v := paramSearch{seen: make(map[int]struct{}), refs: &refs, errs: &errors}
astutils.Walk(v, root)
return refs
if len(*v.errs) > 0 {
problems := *v.errs
return nil, problems[0]
} else {
return refs, nil
}
}

type paramRef struct {
Expand All @@ -24,6 +32,7 @@ type paramSearch struct {
rangeVar *ast.RangeVar
refs *[]paramRef
seen map[int]struct{}
errs *[]error

// XXX: Gross state hack for limit
limitCount ast.Node
Expand All @@ -45,6 +54,10 @@ func (l *limitOffset) Pos() int {
}

func (p paramSearch) Visit(node ast.Node) astutils.Visitor {
if len(*p.errs) > 0 {
return p
}

switch n := node.(type) {

case *ast.A_Expr:
Expand All @@ -64,7 +77,10 @@ func (p paramSearch) Visit(node ast.Node) astutils.Visitor {
if !ok {
continue
}
// TODO: Out-of-bounds panic
if len(n.Cols.Items) <= i {
*p.errs = append(*p.errs, fmt.Errorf("INSERT has more expressions than target columns"))
return p
}
*p.refs = append(*p.refs, paramRef{parent: n.Cols.Items[i], ref: ref, rv: n.Relation})
p.seen[ref.Location] = struct{}{}
}
Expand All @@ -78,7 +94,10 @@ func (p paramSearch) Visit(node ast.Node) astutils.Visitor {
if !ok {
continue
}
// TODO: Out-of-bounds panic
if len(n.Cols.Items) <= i {
*p.errs = append(*p.errs, fmt.Errorf("INSERT has more expressions than target columns"))
return p
}
*p.refs = append(*p.refs, paramRef{parent: n.Cols.Items[i], ref: ref, rv: n.Relation})
p.seen[ref.Location] = struct{}{}
}
Expand Down
5 changes: 4 additions & 1 deletion internal/compiler/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,10 @@ func (c *Compiler) parseQuery(stmt ast.Node, src string, o opts.Parser) (*Query,

raw, namedParams, edits := rewrite.NamedParameters(c.conf.Engine, raw, numbers, dollar)
rvs := rangeVars(raw.Stmt)
refs := findParameters(raw.Stmt)
refs, err := findParameters(raw.Stmt)
if err != nil {
return nil, err
}
if o.UsePositionalParameters {
edits, err = rewriteNumberedParameters(refs, raw, rawSQL)
if err != nil {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
CREATE TABLE foo (bar text);

-- name: InsertFoo :exec
INSERT INTO foo (bar)
SELECT 1, ?, ?;
12 changes: 12 additions & 0 deletions internal/endtoend/testdata/insert_select_invalid/mysql/sqlc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"version": "1",
"packages": [
{
"engine": "mysql",
"path": "go",
"name": "querytest",
"schema": "query.sql",
"queries": "query.sql"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# package querytest
query.sql:4:1: INSERT has more expressions than target columns
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
CREATE TABLE foo (bar text);

-- name: InsertFoo :exec
INSERT INTO foo (bar)
SELECT 1, $1, $2;
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"version": "1",
"packages": [
{
"path": "go",
"engine": "postgresql",
"sql_package": "pgx/v4",
"name": "querytest",
"schema": "query.sql",
"queries": "query.sql"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# package querytest
query.sql:4:1: INSERT has more expressions than target columns
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
CREATE TABLE foo (bar text);

-- name: InsertFoo :exec
INSERT INTO foo (bar)
SELECT 1, $1, $2;
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"version": "1",
"packages": [
{
"engine": "postgresql",
"path": "go",
"name": "querytest",
"schema": "query.sql",
"queries": "query.sql"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# package querytest
query.sql:4:1: INSERT has more expressions than target columns