sqlite3 adaptors tries to "decode" str value when running on Python 3
|Reported by:||Owned by:||nobody|
|Has patch:||no||Needs documentation:||no|
|Needs tests:||no||Patch needs improvement:||no|
I ran into this error when I tried to execute Django on the experimental Pypy3 2.1 (yes, experimental over experimental), and luckly, due to a bug in Pypy support of Python 3, I think I found one on Django. CPython swallows exceptions raised inside sqlite3 adapters, Pypy didn't, thus I found that Django execute these lines, even on Python 3:
if Database.version_info >= (2, 4, 1): # Starting in 2.4.1, the str type is not accepted anymore, therefore, # we convert all str objects to Unicode # As registering a adapter for a primitive type causes a small # slow-down, this adapter is only registered for sqlite3 versions # needing it (Python 2.6 and up). Database.register_adapter(str, lambda s: s.decode('utf-8')) Database.register_adapter(SafeBytes, lambda s: s.decode('utf-8'))
where the str adapter led to a fatal exception on experimental Pypy. But since unicode is str and str is bytes on Python 3 (and bytes is an alias to str on Python 2.6), the relevant line should be:
Database.register_adapter(bytes, lambda s: s.decode('utf-8'))
Or event be suppressed if on py3k... why would one be passing bytes to the database where it expects a string?
The same line is still there on master...