Hi
I think there is a bug handling unknown timezones
To reproduce
import psycopg
dsn = "postgresql://scott:tiger@localhost/test"
conn = psycopg.connect(dsn)
conn.execute('SET SESSION TIME ZONE 0').close()
print(conn.execute('SELECT CURRENT_TIMESTAMP').fetchone())
# # standalone sqlalchemy as example. behaves the same as using only psycopg
# import sqlalchemy as sa
# e = sa.create_engine(dsn.replace('postgresql', 'postgresql+psycopg'))
# with e.connect() as conn:
# conn.exec_driver_sql("SET SESSION TIME ZONE 0")
# print(conn.execute(sa.func.current_timestamp()).scalar())
on windows this prints a the following stacktrace
# on windows
Traceback (most recent call last):
File "psycopg_binary\\_psycopg/transform.pyx", line 612, in psycopg_binary._psycopg.Transformer._c_get_loader
File "psycopg_binary\\types/datetime.pyx", line 701, in psycopg_binary._psycopg.TimestamptzLoader.__init__
File "psycopg_binary\\types/datetime.pyx", line 691, in psycopg_binary._psycopg._BaseTimestamptzLoader.__init__
File "psycopg_binary\\types/datetime.pyx", line 1106, in psycopg_binary._psycopg._timezone_from_connection
File "C:\Users\me\miniconda3\envs\sa\lib\zoneinfo\_common.py", line 12, in load_tzdata
return importlib.resources.open_binary(package_name, resource_name)
File "C:\Users\me\miniconda3\envs\sa\lib\importlib\resources.py", line 46, in open_binary
return reader.open_resource(resource)
File "C:\Users\me\miniconda3\envs\sa\lib\importlib\abc.py", line 433, in open_resource
return self.files().joinpath(resource).open('rb')
File "C:\Users\me\miniconda3\envs\sa\lib\pathlib.py", line 1117, in open
return self._accessor.open(self, mode, buffering, encoding, errors,
OSError: [Errno 22] Invalid argument: 'C:\\Users\\me\\miniconda3\\envs\\sa\\lib\\site-packages\\tzdata\\zoneinfo\\<+00>-00'
Exception ignored in: 'psycopg_binary._psycopg.Transformer.set_pgresult'
Traceback (most recent call last):
File "psycopg_binary\\_psycopg/transform.pyx", line 612, in psycopg_binary._psycopg.Transformer._c_get_loader
File "psycopg_binary\\types/datetime.pyx", line 701, in psycopg_binary._psycopg.TimestamptzLoader.__init__
File "psycopg_binary\\types/datetime.pyx", line 691, in psycopg_binary._psycopg._BaseTimestamptzLoader.__init__
File "psycopg_binary\\types/datetime.pyx", line 1106, in psycopg_binary._psycopg._timezone_from_connection
File "C:\Users\me\miniconda3\envs\sa\lib\zoneinfo\_common.py", line 12, in load_tzdata
return importlib.resources.open_binary(package_name, resource_name)
File "C:\Users\me\miniconda3\envs\sa\lib\importlib\resources.py", line 46, in open_binary
return reader.open_resource(resource)
File "C:\Users\me\miniconda3\envs\sa\lib\importlib\abc.py", line 433, in open_resource
return self.files().joinpath(resource).open('rb')
File "C:\Users\me\miniconda3\envs\sa\lib\pathlib.py", line 1117, in open
return self._accessor.open(self, mode, buffering, encoding, errors,
OSError: [Errno 22] Invalid argument: 'C:\\Users\\me\\miniconda3\\envs\\sa\\lib\\site-packages\\tzdata\\zoneinfo\\<+00>-00'
Uninstalling psycopg-binary also results on an error with similar stack trace
Stack trace
Traceback (most recent call last):
File "C:\Users\me\miniconda3\envs\temp\lib\site-packages\psycopg\_tz.py", line 26, in get_tzinfo
return _timezones[tzname]
KeyError: b'<+00>-00'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\me\Dev\GitHub\sqlalchemy\test2.py", line 7, in <module>
print(conn.execute('SELECT CURRENT_TIMESTAMP').fetchone())
File "C:\Users\me\miniconda3\envs\temp\lib\site-packages\psycopg\connection.py", line 873, in execute
return cur.execute(query, params, prepare=prepare)
File "C:\Users\me\miniconda3\envs\temp\lib\site-packages\psycopg\cursor.py", line 721, in execute
self._conn.wait(
File "C:\Users\me\miniconda3\envs\temp\lib\site-packages\psycopg\connection.py", line 954, in wait
return waiting.wait(gen, self.pgconn.socket, timeout=timeout)
File "C:\Users\me\miniconda3\envs\temp\lib\site-packages\psycopg\waiting.py", line 62, in wait_selector
s = gen.send(ready)
File "C:\Users\me\miniconda3\envs\temp\lib\site-packages\psycopg\cursor.py", line 205, in _execute_gen
self._select_current_result(0)
File "C:\Users\me\miniconda3\envs\temp\lib\site-packages\psycopg\cursor.py", line 517, in _select_current_result
self._tx.set_pgresult(res, format=format)
File "C:\Users\me\miniconda3\envs\temp\lib\site-packages\psycopg\_transform.py", line 152, in set_pgresult
self._row_loaders = [
File "C:\Users\me\miniconda3\envs\temp\lib\site-packages\psycopg\_transform.py", line 153, in <listcomp>
self.get_loader(result.ftype(i), fmt).load for i in range(nf)
File "C:\Users\me\miniconda3\envs\temp\lib\site-packages\psycopg\_transform.py", line 347, in get_loader
loader = self._loaders[format][oid] = loader_cls(oid, self)
File "C:\Users\me\miniconda3\envs\temp\lib\site-packages\psycopg\types\datetime.py", line 505, in __init__
self._timezone = get_tzinfo(self.connection.pgconn if self.connection else None)
File "C:\Users\me\miniconda3\envs\temp\lib\site-packages\psycopg\_tz.py", line 30, in get_tzinfo
zi: tzinfo = ZoneInfo(sname)
File "C:\Users\me\miniconda3\envs\temp\lib\zoneinfo\_common.py", line 12, in load_tzdata
return importlib.resources.open_binary(package_name, resource_name)
File "C:\Users\me\miniconda3\envs\temp\lib\importlib\resources.py", line 46, in open_binary
return reader.open_resource(resource)
File "C:\Users\me\miniconda3\envs\temp\lib\importlib\abc.py", line 433, in open_resource
return self.files().joinpath(resource).open('rb')
File "C:\Users\me\miniconda3\envs\temp\lib\pathlib.py", line 1117, in open
return self._accessor.open(self, mode, buffering, encoding, errors,
OSError: [Errno 22] Invalid argument: 'C:\\Users\\me\\miniconda3\\envs\\temp\\lib\\site-packages\\tzdata\\zoneinfo\\<+00>-00'
I've tried the same code on linux and an error is printed but the script runs otherwise correctly (with or without binary):
# on linux
unknown PostgreSQL timezone: '<+00>-00'; will use UTC
(datetime.datetime(2022, 9, 13, 20, 44, 4, 325059, tzinfo=datetime.timezone.utc),)
I've noticed this error while running the sqlalchemy test suite, where it actually triggers an access violation, that I could not manage to trigger in a standalone script.
The exception happens on the following test of sqlalchemy (on windows, in linux it seems fine)
docker run --rm -e POSTGRES_USER='scott' -e POSTGRES_PASSWORD='tiger' -e POSTGRES_DB='test' -p 127.0.0.1:5432:5432 -d --name postgres postgres:14
docker exec -ti postgres psql -U scott -c 'CREATE SCHEMA test_schema; CREATE SCHEMA test_schema_2;' test
git clone --depth 1 https://github.com/sqlalchemy/sqlalchemy.git
cd sqlalchemy
pip install -e .
pip install pytest psycopg psycopg-binary
pytest --db psycopg test\dialect\postgresql\test_query.py -k test_three
the above errors with access violation:
platform win32 -- Python 3.10.4, pytest-7.1.2, pluggy-1.0.0 -- C:\Users\me\miniconda3\envs\sa\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\me\Dev\GitHub\sqlalchemy, configfile: pyproject.toml
plugins: anyio-3.6.1, forked-1.4.0, xdist-2.5.0
collected 60 items / 59 deselected / 1 selected
test/dialect/postgresql/test_query.py::ExtractTest_postgresql+psycopg_14_5::test_three Windows fatal exception: access violation
Current thread 0x0000f7b8 (most recent call first):
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\psycopg\cursor.py", line 805 in fetchone
File "C:\Users\me\Dev\GitHub\sqlalchemy\lib\sqlalchemy\engine\cursor.py", line 959 in fetchone
File "C:\Users\me\Dev\GitHub\sqlalchemy\lib\sqlalchemy\engine\cursor.py", line 1808 in _fetchone_impl
File "C:\Users\me\Dev\GitHub\sqlalchemy\lib\sqlalchemy\engine\result.py", line 715 in _only_one_row
File "C:\Users\me\Dev\GitHub\sqlalchemy\lib\sqlalchemy\engine\result.py", line 1490 in scalar
File "C:\Users\me\Dev\GitHub\sqlalchemy\test\dialect\postgresql\test_query.py", line 1259 in test_three
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\_pytest\python.py", line 192 in pytest_pyfunc_call
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\pluggy\_callers.py", line 39 in _multicall
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\pluggy\_manager.py", line 80 in _hookexec
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\pluggy\_hooks.py", line 265 in __call__
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\_pytest\python.py", line 1761 in runtest
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\_pytest\runner.py", line 166 in pytest_runtest_call
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\pluggy\_callers.py", line 39 in _multicall
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\pluggy\_manager.py", line 80 in _hookexec
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\pluggy\_hooks.py", line 265 in __call__
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\_pytest\runner.py", line 259 in <lambda>
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\_pytest\runner.py", line 338 in from_call
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\_pytest\runner.py", line 258 in call_runtest_hook
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\_pytest\runner.py", line 219 in call_and_report
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\_pytest\runner.py", line 130 in runtestprotocol
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\_pytest\runner.py", line 111 in pytest_runtest_protocol
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\pluggy\_callers.py", line 39 in _multicall
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\pluggy\_manager.py", line 80 in _hookexec
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\pluggy\_hooks.py", line 265 in __call__
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\_pytest\main.py", line 347 in pytest_runtestloop
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\pluggy\_callers.py", line 39 in _multicall
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\pluggy\_manager.py", line 80 in _hookexec
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\pluggy\_hooks.py", line 265 in __call__
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\_pytest\main.py", line 322 in _main
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\_pytest\main.py", line 268 in wrap_session
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\_pytest\main.py", line 315 in pytest_cmdline_main
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\pluggy\_callers.py", line 39 in _multicall
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\pluggy\_manager.py", line 80 in _hookexec
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\pluggy\_hooks.py", line 265 in __call__
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\_pytest\config\__init__.py", line 164 in main
File "C:\Users\me\miniconda3\envs\sa\lib\site-packages\_pytest\config\__init__.py", line 187 in console_main
File "C:\Users\me\miniconda3\envs\sa\Scripts\pytest.exe\__main__.py", line 7 in <module>
File "C:\Users\me\miniconda3\envs\sa\lib\runpy.py", line 86 in _run_code
File "C:\Users\me\miniconda3\envs\sa\lib\runpy.py", line 196 in _run_module_as_main
python 3.10.4 on windows 10
psycopg 3.1.1
psycopg-binary 3.1.1
psycopg-pool 3.1.1
psycopg2 2.9.3
Hi
I think there is a bug handling unknown timezones
To reproduce
on windows this prints a the following stacktrace
Uninstalling
psycopg-binaryalso results on an error with similar stack traceStack trace
I've tried the same code on linux and an error is printed but the script runs otherwise correctly (with or without binary):
I've noticed this error while running the sqlalchemy test suite, where it actually triggers an access violation, that I could not manage to trigger in a standalone script.
The exception happens on the following test of sqlalchemy (on windows, in linux it seems fine)
the above errors with access violation:
python 3.10.4 on windows 10
psycopg 3.1.1
psycopg-binary 3.1.1
psycopg-pool 3.1.1
psycopg2 2.9.3