Skip to content

Commit 2143e46

Browse files
authored
Handle null PostgreSQL JSON values (#1145)
* codegen/golang: Handle NULL JSON values lib/pq: For nullable values, use pqtype.NullRawMessage pgx/v4: Always use pgtype.JSON[B] * endtoend: Update test cases
1 parent 3114339 commit 2143e46

File tree

5 files changed

+54
-23
lines changed

5 files changed

+54
-23
lines changed

internal/codegen/golang/imports.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,14 +135,17 @@ var stdlibTypes = map[string]string{
135135
var pgtypeTypes = map[string]struct{}{
136136
"pgtype.CIDR": {},
137137
"pgtype.Inet": {},
138+
"pgtype.JSON": {},
139+
"pgtype.JSONB": {},
138140
"pgtype.Macaddr": {},
139141
"pgtype.Numeric": {},
140142
}
141143

142144
var pqtypeTypes = map[string]struct{}{
143-
"pqtype.CIDR": {},
144-
"pqtype.Inet": {},
145-
"pqtype.Macaddr": {},
145+
"pqtype.CIDR": {},
146+
"pqtype.Inet": {},
147+
"pqtype.Macaddr": {},
148+
"pqtype.NullRawMessage": {},
146149
}
147150

148151
func buildImports(settings config.CombinedSettings, queries []Query, uses func(string) bool) (map[string]struct{}, map[ImportSpec]struct{}) {

internal/codegen/golang/postgresql_type.go

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,33 @@ func postgresType(r *compiler.Result, col *compiler.Column, settings config.Comb
7676
}
7777
return "sql.NullBool"
7878

79-
case "json", "jsonb":
80-
return "json.RawMessage"
79+
case "json":
80+
switch driver {
81+
case SQLDriverPGXV4:
82+
return "pgtype.JSON"
83+
case SQLDriverLibPQ:
84+
if notNull {
85+
return "json.RawMessage"
86+
} else {
87+
return "pqtype.NullRawMessage"
88+
}
89+
default:
90+
return "interface{}"
91+
}
92+
93+
case "jsonb":
94+
switch driver {
95+
case SQLDriverPGXV4:
96+
return "pgtype.JSONB"
97+
case SQLDriverLibPQ:
98+
if notNull {
99+
return "json.RawMessage"
100+
} else {
101+
return "pqtype.NullRawMessage"
102+
}
103+
default:
104+
return "interface{}"
105+
}
81106

82107
case "bytea", "blob", "pg_catalog.bytea":
83108
return "[]byte"

internal/endtoend/testdata/json/postgresql/pgx/go/models.go

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

internal/endtoend/testdata/json/postgresql/stdlib/go/models.go

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

internal/endtoend/testdata/json_build/postgresql/pgx/go/query.sql.go

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

0 commit comments

Comments
 (0)