Skip to content

Fix parameter name collision in :one query return values#4383

Merged
kyleconroy merged 1 commit intomainfrom
claude/detect-name-conflict-6UUyV
Apr 17, 2026
Merged

Fix parameter name collision in :one query return values#4383
kyleconroy merged 1 commit intomainfrom
claude/detect-name-conflict-6UUyV

Conversation

@kyleconroy
Copy link
Copy Markdown
Collaborator

Summary

This PR fixes a bug where :one queries would overwrite input parameters when the return value name collides with a parameter name, causing data corruption on sql.ErrNoRows errors.

Problem

When a :one query has a single return column with the same name as an input parameter, the generated code would reuse the parameter variable as the scan destination. This causes the Scan() call to overwrite the input parameter, and if sql.ErrNoRows is returned, the corrupted value leaks back to the caller.

Example of the bug:

func (q *Queries) GetAuthorIDByID(ctx context.Context, id int64) (int64, error) {
    row := q.db.QueryRow(ctx, getAuthorIDByID, id)
    err := row.Scan(&id)  // Overwrites input parameter!
    return id, err
}

Solution

For :one queries, the code generator now detects when the return variable name would collide with any parameter name and automatically renames the return variable by appending _2 (and further suffixes if needed).

Key Changes

  • Modified buildQueries() in internal/codegen/golang/result.go to detect parameter name collisions for :one queries
  • When a collision is detected, the return variable is renamed (e.g., idid_2)
  • Updated all affected test fixtures to reflect the corrected generated code

Implementation Details

  • The collision detection only applies to :one queries (where the scan destination shares scope with parameters)
  • A map of parameter names is built and checked against the return variable name
  • If a collision exists, the return variable name is suffixed with _2, _3, etc. until no collision remains
  • This ensures the scan destination is a separate variable that won't corrupt the input parameters

Fixes #4354

https://claude.ai/code/session_01Ly2rRRcRPXhT2bm6odjeqx

When a generated :one query's single return column shared its name with a
function parameter, sqlc reused the parameter as the Scan destination.
Because Scan leaves the destination untouched on sql.ErrNoRows, the
caller got back the input value instead of a zero value.

Fixes #4354
@kyleconroy kyleconroy merged commit 07c3808 into main Apr 17, 2026
13 checks passed
@kyleconroy kyleconroy deleted the claude/detect-name-conflict-6UUyV branch April 17, 2026 13:54
khepin added a commit to khepin/sqlc that referenced this pull request Apr 18, 2026
…te-order-by-args

* 'main' of https://github.com/sqlc-dev/sqlc:
  Map xid8 to pgtype.Uint64 for pgx/v5 (sqlc-dev#4387)
  Rename :one return variable when it conflicts with a parameter (sqlc-dev#4383)
  Coerce SQLite JSONB output regardless of type casing (sqlc-dev#4385)
  Dedupe sqlc.arg parameters wrapped in a type cast for MySQL (sqlc-dev#4384)
  Preserve MySQL optimizer hints in generated query text (sqlc-dev#4382)
  Skip CI/RTD builds when the change is irrelevant (sqlc-dev#4381)
  build(deps): bump the production-dependencies group across 1 directory with 11 updates (sqlc-dev#4380)
  build(deps): bump the production-dependencies group across 1 directory with 5 updates (sqlc-dev#4368)
  build(deps): bump pygments from 2.19.2 to 2.20.0 in /docs (sqlc-dev#4363)
  build(deps): bump requests from 2.32.5 to 2.33.0 in /docs (sqlc-dev#4357)
  Remove github.com/jackc/pgx/v4 dependency (sqlc-dev#4379)
  Upgrade Go toolchain to 1.26.2 (sqlc-dev#4378)
  build(deps): bump actions/upload-artifact from 6 to 7 (sqlc-dev#4320)
  docs: add sqlc-gen-sqlx to community language support (sqlc-dev#4371)
  build(deps): bump github.com/jackc/pgx/v5 from 5.8.0 to 5.9.0 (sqlc-dev#4377)
  Catch invalid ON CONFLICT DO UPDATE column references (sqlc-dev#4366)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug if column and param share the same name

2 participants