diff --git a/internal/endtoend/testdata/sqlc_embed/postgresql/pgx/go/query.sql.go b/internal/endtoend/testdata/sqlc_embed/postgresql/pgx/go/query.sql.go index 643d5d41d6..2fab1e54f9 100644 --- a/internal/endtoend/testdata/sqlc_embed/postgresql/pgx/go/query.sql.go +++ b/internal/endtoend/testdata/sqlc_embed/postgresql/pgx/go/query.sql.go @@ -162,6 +162,21 @@ func (q *Queries) WithSchema(ctx context.Context) (WithSchemaRow, error) { return i, err } +const withSpaceBeforeParen = `-- name: WithSpaceBeforeParen :one +SELECT users.id, users.name, users.age FROM users +` + +type WithSpaceBeforeParenRow struct { + User User `db:"user" json:"user"` +} + +func (q *Queries) WithSpaceBeforeParen(ctx context.Context) (WithSpaceBeforeParenRow, error) { + row := q.db.QueryRow(ctx, withSpaceBeforeParen) + var i WithSpaceBeforeParenRow + err := row.Scan(&i.User.ID, &i.User.Name, &i.User.Age) + return i, err +} + const withSubquery = `-- name: WithSubquery :many SELECT users.id, users.name, users.age, (SELECT count(*) FROM users) AS total_count FROM users ` diff --git a/internal/endtoend/testdata/sqlc_embed/postgresql/pgx/query.sql b/internal/endtoend/testdata/sqlc_embed/postgresql/pgx/query.sql index 7822145508..22350e4637 100644 --- a/internal/endtoend/testdata/sqlc_embed/postgresql/pgx/query.sql +++ b/internal/endtoend/testdata/sqlc_embed/postgresql/pgx/query.sql @@ -22,4 +22,7 @@ SELECT sqlc.embed(bu) FROM baz.users bu; -- name: WithCrossSchema :many SELECT sqlc.embed(users), sqlc.embed(bu) FROM users -INNER JOIN baz.users bu ON users.id = bu.id; \ No newline at end of file +INNER JOIN baz.users bu ON users.id = bu.id; + +-- name: WithSpaceBeforeParen :one +SELECT sqlc.embed (users) FROM users; diff --git a/internal/sql/rewrite/embeds.go b/internal/sql/rewrite/embeds.go index 596c03be89..b60e000470 100644 --- a/internal/sql/rewrite/embeds.go +++ b/internal/sql/rewrite/embeds.go @@ -2,6 +2,7 @@ package rewrite import ( "fmt" + "strings" "github.com/sqlc-dev/sqlc/internal/sql/ast" "github.com/sqlc-dev/sqlc/internal/sql/astutils" @@ -9,14 +10,15 @@ import ( // Embed is an instance of `sqlc.embed(param)` type Embed struct { - Table *ast.TableName - param string - Node *ast.ColumnRef + Table *ast.TableName + param string + Node *ast.ColumnRef + spaces string } // Orig string to replace func (e Embed) Orig() string { - return fmt.Sprintf("sqlc.embed(%s)", e.param) + return fmt.Sprintf("sqlc.embed%s(%s)", e.spaces, e.param) } // EmbedSet is a set of Embed instances @@ -51,6 +53,15 @@ func Embeds(raw *ast.RawStmt) (*ast.RawStmt, EmbedSet) { param, _ := flatten(fun.Args) + // Calculate spaces between function name and opening parenthesis + // to handle formatters that insert spaces (e.g., pgFormatter) + funcName := "sqlc.embed" + spaces := "" + if fun.Args != nil && len(fun.Args.Items) > 0 { + leftParen := fun.Args.Items[0].Pos() - 1 + spaces = strings.Repeat(" ", leftParen-fun.Location-len(funcName)) + } + node := &ast.ColumnRef{ Fields: &ast.List{ Items: []ast.Node{ @@ -61,9 +72,10 @@ func Embeds(raw *ast.RawStmt) (*ast.RawStmt, EmbedSet) { } embeds = append(embeds, &Embed{ - Table: &ast.TableName{Name: param}, - param: param, - Node: node, + Table: &ast.TableName{Name: param}, + param: param, + Node: node, + spaces: spaces, }) cr.Replace(node)