Skip to content

Commit 9e4a0e7

Browse files
authored
gen: Properly quote reserved keywords on expansion (#436)
1 parent 8e90d42 commit 9e4a0e7

File tree

6 files changed

+103
-6
lines changed

6 files changed

+103
-6
lines changed

internal/dinosql/parser.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,13 @@ func expand(qc *QueryCatalog, raw nodes.RawStmt) ([]edit, error) {
572572
return edits, nil
573573
}
574574

575+
func quoteIdent(ident string) string {
576+
if postgres.IsReservedKeyword(ident) {
577+
return "\"" + ident + "\""
578+
}
579+
return ident
580+
}
581+
575582
func expandStmt(qc *QueryCatalog, raw nodes.RawStmt, node nodes.Node) ([]edit, error) {
576583
tables, err := sourceTables(qc, node)
577584
if err != nil {
@@ -629,26 +636,30 @@ func expandStmt(qc *QueryCatalog, raw nodes.RawStmt, node nodes.Node) ([]edit, e
629636
if scope != "" && scope != t.Name {
630637
continue
631638
}
639+
tableName := quoteIdent(t.Name)
640+
scopeName := quoteIdent(scope)
632641
for _, c := range t.Columns {
633642
cname := c.Name
634643
if res.Name != nil {
635644
cname = *res.Name
636645
}
646+
cname = quoteIdent(cname)
637647
if scope != "" {
638-
cname = scope + "." + cname
648+
cname = scopeName + "." + cname
639649
}
640650
if counts[cname] > 1 {
641-
cname = t.Name + "." + cname
642-
}
643-
if postgres.IsReservedKeyword(cname) {
644-
cname = "\"" + cname + "\""
651+
cname = tableName + "." + cname
645652
}
646653
cols = append(cols, cname)
647654
}
648655
}
656+
var old []string
657+
for _, p := range parts {
658+
old = append(old, quoteIdent(p))
659+
}
649660
edits = append(edits, edit{
650661
Location: res.Location - raw.StmtLocation,
651-
Old: strings.Join(parts, "."),
662+
Old: strings.Join(old, "."),
652663
New: strings.Join(cols, ", "),
653664
})
654665
}

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

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

internal/endtoend/testdata/pg_user_table/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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
CREATE TABLE "user" (id bigserial not null);
2+
3+
-- name: User :many
4+
SELECT "user".* FROM "user";
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)