Skip to content

Commit a963622

Browse files
authored
internal/dinosql: Handle schema-scoped enums (#310)
* internal/dinosql: Handle schema-scoped enums
1 parent efcc4fe commit a963622

File tree

7 files changed

+141
-2
lines changed

7 files changed

+141
-2
lines changed

internal/catalog/build.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,34 @@ func ParseList(list nodes.List) (pg.FQN, error) {
5656
return fqn, nil
5757
}
5858

59+
func ParseString(name string) (pg.FQN, error) {
60+
parts := strings.Split(name, ".")
61+
var fqn pg.FQN
62+
switch len(parts) {
63+
case 1:
64+
fqn = pg.FQN{
65+
Catalog: "",
66+
Schema: "public",
67+
Rel: parts[0],
68+
}
69+
case 2:
70+
fqn = pg.FQN{
71+
Catalog: "",
72+
Schema: parts[0],
73+
Rel: parts[1],
74+
}
75+
case 3:
76+
fqn = pg.FQN{
77+
Catalog: parts[0],
78+
Schema: parts[1],
79+
Rel: parts[2],
80+
}
81+
default:
82+
return fqn, fmt.Errorf("Invalid FQN: %s", name)
83+
}
84+
return fqn, nil
85+
}
86+
5987
func wrap(e pg.Error, loc int) pg.Error {
6088
return e
6189
}

internal/dinosql/gen.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"text/template"
1313
"unicode"
1414

15+
"github.com/kyleconroy/sqlc/internal/catalog"
1516
core "github.com/kyleconroy/sqlc/internal/pg"
1617

1718
"github.com/jinzhu/inflection"
@@ -700,20 +701,26 @@ func (r Result) goInnerType(col core.Column, settings CombinedSettings) string {
700701
return "interface{}"
701702

702703
default:
704+
fqn, err := catalog.ParseString(columnType)
705+
if err != nil {
706+
// TODO: Should this actually return an error here?
707+
return "interface{}"
708+
}
709+
703710
for name, schema := range r.Catalog.Schemas {
704711
if name == "pg_catalog" {
705712
continue
706713
}
707714
for _, enum := range schema.Enums {
708-
if columnType == enum.Name {
715+
if fqn.Rel == enum.Name && fqn.Schema == name {
709716
if name == "public" {
710717
return StructName(enum.Name, settings)
711718
}
712-
713719
return StructName(name+"_"+enum.Name, settings)
714720
}
715721
}
716722
}
723+
717724
log.Printf("unknown PostgreSQL type: %s\n", columnType)
718725
return "interface{}"
719726
}

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

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

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

Lines changed: 35 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CREATE SCHEMA foo;
2+
3+
CREATE TYPE foo.type_user_role AS ENUM ('admin', 'user');
4+
5+
CREATE TABLE foo.users (
6+
role foo.type_user_role
7+
);
8+
9+
-- name: ListUsersByRole :many
10+
SELECT * FROM foo.users WHERE role = $1;
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)