sqlc-dev / sqlc-gen-typescript

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

MySQL: args for offset, limit seem to be always number regardless of bigNumberStrings option value

yshrsmz opened this issue · comments

also posted to node-mysql2: sidorares/node-mysql2#2551

As stated in the title(and the liked issue), node-mysql2 seems to always use number for limit and offset(and possibly some other cases).

And that does not work well with our current implementation.

-- name: FindManyByAccountId :many
SELECT
  account_transaction_id,
  executed_at,
  account_id,
  point_saas_account_transaction_category_id,
  tenant_account_transaction_category_id,
  history_type,
  amount,
  expired_at,
  balance,
  title,
  content,
  sorted_id,
  created_at
FROM
  account_transactions
WHERE
  account_id = ?
ORDER BY
  executed_at DESC,
  sorted_id DESC
LIMIT
  ?
OFFSET
  ?;

sqlc-gen-typescript currently generates following code for the above query.

export interface FindManyByAccountIdArgs {
  accountId: number
  limit: string
  offset: string
}

export async function findManyByAccountId(
  client: Client,
  args: FindManyByAccountIdArgs,
): Promise<FindManyByAccountIdRow[]> {
  const [rows] = await client.query<RowDataPacket[]>({
    sql: findManyByAccountIdQuery,
    values: [args.accountId, args.limit, args.offset],
    rowsAsArray: true,
  })
  return rows.map((row) => {
    return {
      accountTransactionId: row[0],
      executedAt: row[1],
      accountId: row[2],
      pointSaasAccountTransactionCategoryId: row[3],
      tenantAccountTransactionCategoryId: row[4],
      historyType: row[5],
      amount: row[6],
      expiredAt: row[7],
      balance: row[8],
      title: row[9],
      content: row[10],
      sortedId: row[11],
      createdAt: row[12],
    }
  })
}

and this code results in the following node-mysql2 error

 { 
  code: 'ER_PARSE_ERROR', 
  errno: 1064, 
  sql: '-- name: FindManyByAccountId :many\nSELECT\n  account_transaction_id,\n  account_id,\n  point_saas_account_transaction_category_id,\n  tenant_account_transaction_category_id,\n  history_type,\n  amount,\n  expired_at,\n  balance,\n  title,\n  content,\n  created_at\nFROM\n  account_transactions\nWHERE\n  account_id = 1\nORDER BY\n  created_at DESC\nLIMIT\n  \'0\', \'20\'',
  sqlState: '42000', 
  sqlMessage: 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\'20\', \'0\'\' at line 21'
}

So I think node-mysql2 does not respect supportBigNumbers and bigNumberStrings options here.

What I came up with is these two solution:

  1. Somehow get which argument is used for which column/condition, and decide TypeScript type
    • I believe this is not possible for now (see #22 )
  2. Loosen the BigNumber type to always string | number and let users chose the type
    • if both supportBigNumbers and bigNumberStrings is false/unspecified, use number in that case.