Skip to content

Commit 1ac6f19

Browse files
fix(compiler): Support functions with OUT params (#2865)
* test: add a test case for #1654 * fix(compiler): Support functions with OUT params * Add generated code --------- Co-authored-by: Andrew Benton <[email protected]>
1 parent bd46afa commit 1ac6f19

File tree

11 files changed

+141
-8
lines changed

11 files changed

+141
-8
lines changed

internal/compiler/output_columns.go

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -550,12 +550,15 @@ func (c *Compiler) sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, erro
550550
if err != nil {
551551
continue
552552
}
553-
table, err := qc.GetTable(&ast.TableName{
554-
Catalog: fn.ReturnType.Catalog,
555-
Schema: fn.ReturnType.Schema,
556-
Name: fn.ReturnType.Name,
557-
})
558-
if err != nil {
553+
var table *Table
554+
if fn.ReturnType != nil {
555+
table, err = qc.GetTable(&ast.TableName{
556+
Catalog: fn.ReturnType.Catalog,
557+
Schema: fn.ReturnType.Schema,
558+
Name: fn.ReturnType.Name,
559+
})
560+
}
561+
if table == nil || err != nil {
559562
if n.Alias != nil && len(n.Alias.Colnames.Items) > 0 {
560563
table = &Table{}
561564
for _, colName := range n.Alias.Colnames.Items {
@@ -575,12 +578,22 @@ func (c *Compiler) sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, erro
575578
Schema: fn.Rel.Schema,
576579
Name: fn.Rel.Name,
577580
},
578-
Columns: []*Column{
581+
}
582+
if len(fn.Outs) > 0 {
583+
for _, arg := range fn.Outs {
584+
table.Columns = append(table.Columns, &Column{
585+
Name: arg.Name,
586+
DataType: arg.Type.Name,
587+
})
588+
}
589+
}
590+
if fn.ReturnType != nil {
591+
table.Columns = []*Column{
579592
{
580593
Name: colName,
581594
DataType: fn.ReturnType.Name,
582595
},
583-
},
596+
}
584597
}
585598
}
586599
}

internal/compiler/query.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ package compiler
33
import (
44
"github.com/sqlc-dev/sqlc/internal/metadata"
55
"github.com/sqlc-dev/sqlc/internal/sql/ast"
6+
"github.com/sqlc-dev/sqlc/internal/sql/catalog"
67
)
78

89
type Function struct {
910
Rel *ast.FuncName
1011
ReturnType *ast.TypeName
12+
Outs []*catalog.Argument
1113
}
1214

1315
type Table struct {

internal/compiler/query_catalog.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ func (qc QueryCatalog) GetFunc(rel *ast.FuncName) (*Function, error) {
103103
}
104104
return &Function{
105105
Rel: rel,
106+
Outs: funcs[0].OutArgs(),
106107
ReturnType: funcs[0].ReturnType,
107108
}, nil
108109
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
https://github.com/sqlc-dev/sqlc/issues/1654

internal/endtoend/testdata/func_out_param/pgx/go/db.go

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

internal/endtoend/testdata/func_out_param/pgx/go/models.go

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

internal/endtoend/testdata/func_out_param/pgx/go/query.sql.go

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-- name: CreateAuthor :one
2+
SELECT * FROM add_author (
3+
sqlc.arg(name), sqlc.arg(bio)
4+
);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
-- Example queries for sqlc
2+
CREATE TABLE authors (
3+
id BIGSERIAL PRIMARY KEY,
4+
name text NOT NULL,
5+
bio text
6+
);
7+
8+
CREATE OR REPLACE FUNCTION add_author (name text, bio text, out id int)
9+
AS $$
10+
DECLARE
11+
BEGIN
12+
id = 123;
13+
END;
14+
$$ LANGUAGE plpgsql;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
version: "2"
2+
sql:
3+
- engine: "postgresql"
4+
schema: "schema.sql"
5+
queries: "query.sql"
6+
gen:
7+
go:
8+
package: "querytest"
9+
out: "go"
10+
sql_package: "pgx/v5"

internal/sql/catalog/func.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,17 @@ func (f *Function) InArgs() []*Argument {
3939
return args
4040
}
4141

42+
func (f *Function) OutArgs() []*Argument {
43+
var args []*Argument
44+
for _, a := range f.Args {
45+
switch a.Mode {
46+
case ast.FuncParamOut:
47+
args = append(args, a)
48+
}
49+
}
50+
return args
51+
}
52+
4253
func (c *Catalog) createFunction(stmt *ast.CreateFunctionStmt) error {
4354
ns := stmt.Func.Schema
4455
if ns == "" {

0 commit comments

Comments
 (0)