Skip to content

MySQL/Golang - Wrong generated argument type for DATEDIFF comparisonΒ #4268

@maglicheev-check24

Description

@maglicheev-check24

Version

1.30.0

What happened?

When sqlc generates Golang code for a MySQL query with DATEDIFF() comparison in it:

SELECT id
FROM wishlist_item
WHERE DATEDIFF(date_from, NOW()) >= sqlc.arg('min_days_to_date_from') AND
      DATEDIFF(date_from, NOW()) <= sqlc.arg('max_days_to_date_from') AND
      updated_at < sqlc.arg('updated_by');

resulting datetype for arguments min_days_to_date_from/max_days_to_date_from is time.Time, even though DATEDIFF itself outputs an integer

const getUpdateableWishlistItemIDs = `-- name: GetUpdateableWishlistItemIDs :many
SELECT id
FROM wishlist_item
WHERE DATEDIFF(date_from, NOW()) >= ? AND
      DATEDIFF(date_from, NOW()) <= ? AND
      updated_at < ?
`

type GetUpdateableWishlistItemIDsParams struct {
	MinDaysToDateFrom time.Time
	MaxDaysToDateFrom time.Time
	UpdatedBy         sql.NullTime
}

func (q *Queries) GetUpdateableWishlistItemIDs(ctx context.Context, arg GetUpdateableWishlistItemIDsParams) ([]uint32, error) {
	rows, err := q.db.QueryContext(ctx, getUpdateableWishlistItemIDs, arg.MinDaysToDateFrom, arg.MaxDaysToDateFrom, arg.UpdatedBy)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var items []uint32
	for rows.Next() {
		var id uint32
		if err := rows.Scan(&id); err != nil {
			return nil, err
		}
		items = append(items, id)
	}
	if err := rows.Close(); err != nil {
		return nil, err
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	return items, nil
}

The generated type of MinDaysToDateFrom should be int32, not time.Time

Relevant log output

Database schema

CREATE TABLE `wishlist_item` (
  `id` int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  .........unrelated fields
  `date_from` date NOT NULL,
  .........unrelated fields
  `updated_at` timestamp NULL DEFAULT NULL,
  .......unrelated fields
;

SQL queries

SELECT id
FROM wishlist_item
WHERE DATEDIFF(date_from, NOW()) >= sqlc.arg('min_days_to_date_from') AND
      DATEDIFF(date_from, NOW()) <= sqlc.arg('max_days_to_date_from') AND
      updated_at < sqlc.arg('updated_by');

Configuration

version: "2"
sql:
  - engine: mysql
    schema: migrations
    queries: queries
    gen:
      go:
        package: models
        sql_package: "database/sql"
        sql_driver: "github.com/go-sql-driver/mysql"
        out: models

Playground URL

No response

What operating system are you using?

macOS

What database engines are you using?

MySQL

What type of code are you generating?

Go

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions