chtd / psycopg2cffi

Port to cffi with some speed improvements
Other
177 stars 43 forks source link

DataError parsing datetime from postgresql 9.6.1 #78

Closed jaysonsantos closed 7 years ago

jaysonsantos commented 7 years ago

How to reproduce: Using pypy3 nightly version with python3.5 compatibility http://buildbot.pypy.org/nightly/py3.5/pypy-c-jit-90503-6c8f0848fcf2-linux64.tar.bz2

import psycopg2cffi
conn = psycopg2cffi.connect('postgresql://server/db')
cur = conn.cursor()
cur.execute('select now()')
cur.fetchall()

this will be thrown

----> 1 cur.fetchall()

/usr/local/site-packages/psycopg2cffi/_impl/cursor.py in check_closed_(self, *args, **kwargs)
     28         if self.closed:
     29             raise InterfaceError("connection already closed")
---> 30         return func(self, *args, **kwargs)
     31     return check_closed_
     32 

/usr/local/site-packages/psycopg2cffi/_impl/cursor.py in check_no_tuples_(self, *args, **kwargs)
     41         if self._no_tuples and self._name is None:
     42             raise ProgrammingError("no results to fetch")
---> 43         return func(self, *args, **kwargs)
     44     return check_no_tuples_
     45 

/usr/local/site-packages/psycopg2cffi/_impl/cursor.py in fetchall(self)
    375             return []
    376 
--> 377         return [self._build_row() for _ in xrange(size)]
    378 
    379     def nextset(self):

/usr/local/site-packages/psycopg2cffi/_impl/cursor.py in <listcomp>(.0)
    375             return []
    376 
--> 377         return [self._build_row() for _ in xrange(size)]
    378 
    379     def nextset(self):

/usr/local/site-packages/psycopg2cffi/_impl/cursor.py in _build_row(self)
    889                         self._pgres, row_num, i), length)[:]
    890                     row[i] = typecasts.typecast(
--> 891                             self._casts[i], val, length, self)
    892 
    893         self._rownumber += 1

/usr/local/site-packages/psycopg2cffi/_impl/typecasts.py in typecast(caster, value, length, cursor)
     69 
     70 def typecast(caster, value, length, cursor):
---> 71     return caster.cast(value, cursor, length)
     72 
     73 

/usr/local/site-packages/psycopg2cffi/_impl/typecasts.py in cast(self, value, cursor, length)
     37                 value = value.decode(cursor._conn._py_enc)
     38             return self.py_caster(value, cursor)
---> 39         return self.caster(value, length, cursor)
     40 
     41     __call__ = cast

/usr/local/site-packages/psycopg2cffi/_impl/typecasts.py in parse_datetime(value, length, cursor)
    291         if value.endswith(b'BC'):
    292             raise ValueError('BC dates not supported')
--> 293         raise DataError("bad datetime: '%s'" % bytes_to_ascii(value))
    294 
    295 

DataError: bad datetime: '2017-03-03 10:54:18.428469+00'

looks like it will break on tz = super(FixedOffsetTimezone, cls).__new__(cls, offset, name) here https://github.com/chtd/psycopg2cffi/blob/master/psycopg2cffi/tz.py#L68 with TypeError: object() takes no parameters

jaysonsantos commented 7 years ago

It won't break on cPython 3.5.3, it may be related to pypy. I will try to run more tests and check what is happening.

jaysonsantos commented 7 years ago

I've reported it here https://bitbucket.org/pypy/pypy/issues/2489/typeerror-object-takes-no-parameters-when

jaysonsantos commented 7 years ago

This was fixed in pypy https://bitbucket.org/pypy/pypy/issues/2489/typeerror-object-takes-no-parameters-when Thanks!

lopuhin commented 7 years ago

Thanks a lot @jaysonsantos !