asyncpg icon indicating copy to clipboard operation
asyncpg copied to clipboard

OverflowError: date value out of range

Open vikramarsid opened this issue 6 years ago • 5 comments

  • asyncpg version: 0.18.3
  • PostgreSQL version: 10.7
  • Do you use a PostgreSQL SaaS? If so, which? Can you reproduce the issue with a local PostgreSQL install?: Yes
  • Python version: 3.7
  • Platform: Mac OS
  • Do you use pgbouncer?: No
  • Did you install asyncpg with pip?: Yes
  • If you built asyncpg locally, which version of Cython did you use?:
  • Can the issue be reproduced under both asyncio and uvloop?:

asyncpg is failing to parse timestamp

code:

import asyncio
import asyncpg

async def run():
    conn = await asyncpg.connect(user='secure', password='secure',
                                 database='secure',
                                 host='secure.com', port=15432, timeout=600)

    values = await conn.fetch('''SELECT  _ts FROM Events''')
    print(values)
    await conn.close()


loop = asyncio.get_event_loop()
loop.run_until_complete(run())
Timestamp format: 2019-01-01T08:42:25.921Z
Traceback (most recent call last):
  File "/scratch_65.py", line 21, in <module>
    loop.run_until_complete(run())
  File "/usr/local/Cellar/python/3.7.2/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py", line 584, in run_until_complete
    return future.result()
  File "/scratch_65.py", line 15, in run
    values = await conn.fetch('''SELECT  _ts FROM Events''')
  File "/lib/python3.7/site-packages/asyncpg/connection.py", line 421, in fetch
    return await self._execute(query, args, 0, timeout)
  File "/lib/python3.7/site-packages/asyncpg/connection.py", line 1414, in _execute
    query, args, limit, timeout, return_status=return_status)
  File "/lib/python3.7/site-packages/asyncpg/connection.py", line 1422, in __execute
    return await self._do_execute(query, executor, timeout)
  File "/lib/python3.7/site-packages/asyncpg/connection.py", line 1444, in _do_execute
    result = await executor(stmt, None)
  File "asyncpg/protocol/protocol.pyx", line 196, in bind_execute
  File "asyncpg/protocol/coreproto.pyx", line 65, in asyncpg.protocol.protocol.CoreProtocol._read_server_messages
  File "asyncpg/protocol/coreproto.pyx", line 202, in asyncpg.protocol.protocol.CoreProtocol._process__bind_execute
  File "asyncpg/protocol/coreproto.pyx", line 498, in asyncpg.protocol.protocol.CoreProtocol._parse_data_msgs
  File "asyncpg/protocol/protocol.pyx", line 754, in asyncpg.protocol.protocol.BaseProtocol._decode_row
  File "asyncpg/protocol/prepared_stmt.pyx", line 282, in asyncpg.protocol.protocol.PreparedStatementState._decode_row
  File "asyncpg/protocol/codecs/base.pyx", line 288, in asyncpg.protocol.protocol.Codec.decode
  File "asyncpg/protocol/codecs/base.pyx", line 195, in asyncpg.protocol.protocol.Codec.decode_scalar
  File "asyncpg/pgproto/./codecs/datetime.pyx", line 252, in asyncpg.pgproto.pgproto.timestamptz_decode
OverflowError: date value out of range

vikramarsid avatar Feb 18 '19 05:02 vikramarsid

As suggested in #404, I have used the custom codec for the date type. But still, it fails with a different error.

    await conn.set_type_codec(
        typename='date', encoder=str, decoder=str,
            schema='public', format='text'
    )
Traceback (most recent call last):
  File "/scratch_65.py", line 20, in <module>
    loop.run_until_complete(run())
  File "/usr/local/Cellar/python/3.7.2/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py", line 584, in run_until_complete
    return future.result()
  File "/scratches/scratch_65.py", line 11, in run
    schema='public', format='text'
  File "/.virtualenvs/darwin-api/lib/python3.7/site-packages/asyncpg/connection.py", line 964, in set_type_codec
    introspection.TYPE_BY_NAME, typename, schema)
  File "/.virtualenvs/darwin-api/lib/python3.7/site-packages/asyncpg/connection.py", line 455, in fetchrow
    data = await self._execute(query, args, 1, timeout)
  File "/.virtualenvs/darwin-api/lib/python3.7/site-packages/asyncpg/connection.py", line 1414, in _execute
    query, args, limit, timeout, return_status=return_status)
  File "/.virtualenvs/darwin-api/lib/python3.7/site-packages/asyncpg/connection.py", line 1422, in __execute
    return await self._do_execute(query, executor, timeout)
  File "/.virtualenvs/darwin-api/lib/python3.7/site-packages/asyncpg/connection.py", line 1437, in _do_execute
    stmt = await self._get_statement(query, timeout)
  File "/.virtualenvs/darwin-api/lib/python3.7/site-packages/asyncpg/connection.py", line 329, in _get_statement
    statement = await self._protocol.prepare(stmt_name, query, timeout)
  File "asyncpg/protocol/protocol.pyx", line 163, in prepare
asyncpg.exceptions._base.UnknownPostgresError: ERR_PARAMETER_NOT_INITIALIZED: Parameter ":1" was not initialized 

vikramarsid avatar Feb 19 '19 23:02 vikramarsid

@elprans Any thoughts on the above issue?

vikramarsid avatar Feb 19 '19 23:02 vikramarsid

I don't recognize that error. Are you running vanilla Postgres?

elprans avatar Feb 20 '19 01:02 elprans

Also, you probably meant this (your column is a timetstamp, not a date):

    await conn.set_type_codec(
        typename='timestamptz', encoder=str, decoder=str,
            schema='pg_catalog', format='text'
    )

elprans avatar Feb 20 '19 01:02 elprans

I seem to be hitting this OverflowError: date value out of range even when within the connection pool's connection init callback I use a the very custom codec in the latest reply above (times two, once for timestamp and once for timestamptz. This is happening with a prepared statement's fetch. Next, if I didn't encounter this exception upon reading, the attained records would be fed into an other prepared statement's executemany.

ale-dd avatar Mar 06 '22 09:03 ale-dd