Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Parameters with Array type have incorrect names #243

Closed
ErrorBoi opened this issue Jan 9, 2020 · 5 comments
Closed

Parameters with Array type have incorrect names #243

ErrorBoi opened this issue Jan 9, 2020 · 5 comments
Labels

Comments

@ErrorBoi
Copy link

ErrorBoi commented Jan 9, 2020

What happened?

Hello, I'm trying to generate Go Code from SQL Query using ANY method. When I run sqlc generate, variable with array method gets unexpected name.

Actual result: Variable with []int type gets dollar_1 name
Expected result: Variable gets IDs name

Note: variable might get Column + Number name (e.g. Column4) when sql query contains several ANY methods in it.

Database schema

CREATE TABLE pilots (
  id BIGSERIAL PRIMARY KEY
);

SQL queries

-- name: ListPilotsByIDs :many
SELECT * FROM pilots
WHERE id = ANY($1::int[]);

Configuration

Playground URL

https://play.sqlc.dev/p/455e276514a8ecf33f4d86175da22a6965058d86d08a9e127c59e3a3a9acbad4

@kyleconroy kyleconroy added 📚 postgresql bug Something isn't working labels Feb 11, 2020
@kyleconroy
Copy link
Collaborator

Agreed that this is a bug. In the meantime, you can use named parameters to get the correct parameter name:

-- name: ListPilotsByIDs :many
SELECT * FROM pilots
WHERE id = ANY(sqlc.arg(ids)::int[]);

Or using the @ shortcut:

-- name: ListPilotsByIDs :many
SELECT * FROM pilots
WHERE id = ANY(@ids::int[]);

@MinSomai
Copy link
Contributor

MinSomai commented Apr 7, 2021

Below doesn't work. any solution to this? (ANSWERED)

-- name: ListTransfers :many
SELECT * FROM transfers
WHERE
    from_account_id = ANY(sqlc.arg(from_account_ids)::int[]) OR
    to_account_id = ANY(sqlc.arg(to_account_ids)::int[])
ORDER BY id
LIMIT $1
OFFSET $2;

error

query mixes positional parameters ($1) and named parameters (sqlc.arg or @arg)

Update:
seems I can use sqlc.arg with limit but I cannot name it limit
like this

LIMIT sqlc.arg(limit)

Update:
this works.

LIMIT sqlc.arg('limit')

@theenoahmason
Copy link

@kyleconroy How can I accomplish the above example in MySQL?

-- name: ListPilotsByIDs :many
SELECT * FROM pilots
WHERE id = ANY(@ids::int[]);

sqlc.arg('ids')::int[] results in a syntax error.

@xeoncross
Copy link
Contributor

Looks like sqlc needs to support passing slices to MySQL queries #695 first

@kyleconroy
Copy link
Collaborator

This can be accomplished in MySQL and SQLite using sqlc.slice.

As for the parameter name, sqlc.arg Anand named parameters solve this issue nicely.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

5 participants