sqlc icon indicating copy to clipboard operation
sqlc copied to clipboard

copyfrom not respecting `query_parameter_limit`

Open KlemenPl opened this issue 1 year ago • 1 comments

Version

1.26.0

What happened?

When using :copyfrom query with query_parameter_limit set, generated code will still try to use parameter struct:

func (q *Queries) CreateAuthors(ctx context.Context, arg []CreateAuthorsParams) (int64, error) {
	return q.db.CopyFrom(ctx, []string{"author"}, []string{"name", "bio"}, &iteratorForCreateAuthors{rows: arg})
}

Meanwhile, if you use :one it will respect set query_parameter_limit:

func (q *Queries) CreateAuthor(ctx context.Context, name string, bio pgtype.Text) (int64, error) {
	row := q.db.QueryRow(ctx, createAuthor, name, bio)
	var id int64
	err := row.Scan(&id)
	return id, err
}

Relevant log output

No response

Database schema

CREATE TABLE author (
  id   BIGSERIAL PRIMARY KEY,
  name text      NOT NULL,
  bio  text
);

SQL queries

-- name: CreateAuthor :one
INSERT INTO author
	(name, bio)
VALUES (@name, @bio)
RETURNING id;

-- name: CreateAuthors :copyfrom
INSERT INTO author
	(name, bio)
VALUES (@name, @bio);

Configuration

{
  "version": "2",
  "sql": [{
    "schema": "schema.sql",
    "queries": "query.sql",
    "engine": "postgresql",
    "gen": {
      "go": {
        "out": "db",
        "query_parameter_limit": 100,
        "sql_package": "pgx/v5"
      }
    }
  }]
}

Playground URL

https://play.sqlc.dev/p/849ecfee7a92c0862b4e877189cb3ddd33c2b181ae1266ada98e8f25f635004f

What operating system are you using?

Linux

What database engines are you using?

PostgreSQL

What type of code are you generating?

Go

KlemenPl avatar May 16 '24 19:05 KlemenPl

I am having the same issue

aliml92 avatar Jun 04 '24 04:06 aliml92

As copyfrom is a function to import multiple rows at once it makes sense that it always takes an slice as input. What would the interface be otherwise?

func (q *Queries) CreateAuthors(ctx context.Context, author1, bio1, author2, bio2) is far from ergonomic to use.

ysmilda avatar Jul 24 '24 08:07 ysmilda

As copyfrom is a function to import multiple rows at once it makes sense that it always takes an slice as input. What would the interface be otherwise?

func (q *Queries) CreateAuthors(ctx context.Context, author1, bio1, author2, bio2) is far from ergonomic to use.

I agree, it should take slice as an input. My problem is that CreateAuthorParams is not generated, if you use query_parameter_limit and therefore the code does not compile (please see playground example).

KlemenPl avatar Jul 24 '24 10:07 KlemenPl

I've run into that as well. It is a known issue (#3197) and already fixed in the main branch (#3446). The problem being that it is not yet released.

You could go install the latest commit and execute the binary from the go/bin folder.

ysmilda avatar Jul 24 '24 15:07 ysmilda