asyncpg icon indicating copy to clipboard operation
asyncpg copied to clipboard

Unexpected/undesirable `CAST` of date string to `VARCHAR`

Open ccrvlh opened this issue 1 year ago • 0 comments

  • asyncpg version: 0.29.0
  • PostgreSQL version: 15.7
  • Python version: 3.11
  • Platform: macOS 13.6
  • Do you use pgbouncer?: no
  • Did you install asyncpg with pip?: no (poetry)
start_date = '2024-01-01'
query.where(MyTable.datetime_col >= start_date)

This will fail:

<class 'asyncpg.exceptions.UndefinedFunctionError'>: operator does not exist: timestamp without time zone >= character varying

It seems that this is being casted as VARCHAR:

SELECT * FROM my_table WHERE datetime_col >= $1::VARCHAR

This same filter is valid in Postgres

SELECT * FROM my_table WHERE datetime_col >= '2024-01-01'

It works when using the datetime object:

start_date = dt.datetime.strptime(start_date, "%Y-%m-%d")
query.where(MyTable.datetime_col >= start_date)

Wonder if this is somewhat similar to #1169 in the sense that casting/argument handling invalidates valid SQL statements.

I'd have imagined that castings were performed in obvious and non-breaking scenarios, and scenarios where casting would be necessary, but are not obvious should be handled directly by the user. Breaking valid SQL statements seems counter intuitive IMHO.

ccrvlh avatar Aug 18 '24 06:08 ccrvlh