From fe4fed283764ccecd9bf8d98b330e58f2991dfcb Mon Sep 17 00:00:00 2001 From: Andreas Kutschera Date: Thu, 7 Jul 2022 15:30:54 +0200 Subject: [PATCH] fix(postgresql): Add quotes for CamelCase columns If columns are created with CamelCase, they have to be quoted or else postgres won't find them. --- internal/compiler/compile_test.go | 38 +++++++++++++++++++ internal/compiler/expand.go | 6 +++ .../postgresql/stdlib/go/query.sql.go | 2 +- .../select_star/postgresql/stdlib/schema.sql | 4 +- 4 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 internal/compiler/compile_test.go diff --git a/internal/compiler/compile_test.go b/internal/compiler/compile_test.go new file mode 100644 index 0000000000..4ede452c16 --- /dev/null +++ b/internal/compiler/compile_test.go @@ -0,0 +1,38 @@ +package compiler + +import ( + "testing" + + "github.com/kyleconroy/sqlc/internal/config" +) + +func TestQuoteIdent(t *testing.T) { + type test struct { + engine config.Engine + in string + want string + } + tests := []test{ + {config.EnginePostgreSQL, "age", "age"}, + {config.EnginePostgreSQL, "Age", `"Age"`}, + {config.EnginePostgreSQL, "CamelCase", `"CamelCase"`}, + {config.EngineMySQL, "CamelCase", "CamelCase"}, + // keywords + {config.EnginePostgreSQL, "select", `"select"`}, + {config.EngineMySQL, "select", "`select`"}, + } + + for _, spec := range tests { + compiler := NewCompiler(config.SQL{ + Engine: spec.engine, + }, config.CombinedSettings{}) + + t.Run(spec.in, func(t *testing.T) { + got := compiler.quoteIdent(spec.in) + if got != spec.want { + t.Error("quoteIdent: engine " + string(spec.engine) + " failed for " + spec.in + ", want " + spec.want + ", got " + got) + } + }) + } + +} diff --git a/internal/compiler/expand.go b/internal/compiler/expand.go index 75ab05c4ed..5c2e9c481a 100644 --- a/internal/compiler/expand.go +++ b/internal/compiler/expand.go @@ -45,6 +45,12 @@ func (c *Compiler) quoteIdent(ident string) string { return "\"" + ident + "\"" } } + if c.conf.Engine == config.EnginePostgreSQL { + // camelCase means the column is also camelCase + if strings.ToLower(ident) != ident { + return "\"" + ident + "\"" + } + } return ident } diff --git a/internal/endtoend/testdata/select_star/postgresql/stdlib/go/query.sql.go b/internal/endtoend/testdata/select_star/postgresql/stdlib/go/query.sql.go index efc7972372..79b38f2239 100644 --- a/internal/endtoend/testdata/select_star/postgresql/stdlib/go/query.sql.go +++ b/internal/endtoend/testdata/select_star/postgresql/stdlib/go/query.sql.go @@ -10,7 +10,7 @@ import ( ) const getAll = `-- name: GetAll :many -SELECT id, first_name, last_name, age FROM users +SELECT id, first_name, last_name, "Age" FROM users ` func (q *Queries) GetAll(ctx context.Context) ([]User, error) { diff --git a/internal/endtoend/testdata/select_star/postgresql/stdlib/schema.sql b/internal/endtoend/testdata/select_star/postgresql/stdlib/schema.sql index 0fe1b79a5c..f22f2fda30 100644 --- a/internal/endtoend/testdata/select_star/postgresql/stdlib/schema.sql +++ b/internal/endtoend/testdata/select_star/postgresql/stdlib/schema.sql @@ -1,6 +1,6 @@ CREATE TABLE users ( - id integer NOT NULL PRIMARY KEY, + ID integer NOT NULL PRIMARY KEY, first_name varchar(255) NOT NULL, last_name varchar(255), - age integer NOT NULL + "Age" integer NOT NULL );