Connecting via unix socket on a specific DB crashes pgcli
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 35/100
Piste de recherche
Commencez par pgcli/main.py, pgcli/pgcompleter.py et pgcli/completion_refresher.py, puis suivez pgexecute.get_socket_directory pour les connexions aux bases de données par défaut et nommées. Comparez les valeurs renvoyées dans chaque chemin et suivez la manière dont elles parviennent à get_prompt et escaped_names. C’est terminé lorsque le lancement de pgcli avec une base de données spécifique via un socket Unix ne déclenche plus aucun des deux TypeError str/bytes signalés.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Description
Hello
Installing pgcli 3.5.0 on a Debian server with postgresql 15, when, as unix user postgres, I run a simple pgcli, I get a proper prompt, but as soon as I use pgcli XXX with XXXbeing another database, pgcli crashes while starting because it tries to mix str and bytes.
postgres@pgsql:~$ pgcli
Server: PostgreSQL 15.3 (Debian 15.3-0+deb12u1)
Version: 3.5.0
Home: http://pgcli.com
postgres>
Goodbye!
postgres@pgsql:~$ pgcli icinga2
Server: PostgreSQL 15.3 (Debian 15.3-0+deb12u1)
Version: 3.5.0
Home: http://pgcli.com
Traceback (most recent call last):
File "/usr/bin/pgcli", line 33, in <module>
Exception in thread completion_refresh:
Traceback (most recent call last):
File "/usr/lib/python3.11/threading.py", line 1038, in _bootstrap_inner
sys.exit(load_entry_point('pgcli==3.5.0', 'console_scripts', 'pgcli')())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/click/core.py", line 1130, in __call__
self.run()
File "/usr/lib/python3.11/threading.py", line 975, in run
return self.main(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/click/core.py", line 1055, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
self._target(*self._args, **self._kwargs)
File "/usr/lib/python3/dist-packages/pgcli/completion_refresher.py", line 68, in _bg_refresh
File "/usr/lib/python3/dist-packages/click/core.py", line 1404, in invoke
refresher(completer, executor)
File "/usr/lib/python3/dist-packages/pgcli/completion_refresher.py", line 109, in refresh_schemata
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/click/core.py", line 760, in invoke
completer.set_search_path(executor.search_path())
File "/usr/lib/python3/dist-packages/pgcli/pgcompleter.py", line 306, in set_search_path
return __callback(*args, **kwargs)
self.search_path = self.escaped_names(search_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/pgcli/main.py", line 1427, in cli
File "/usr/lib/python3/dist-packages/pgcli/pgcompleter.py", line 150, in escaped_names
return [self.escape_name(name) for name in names]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/pgcli/pgcompleter.py", line 150, in <listcomp>
pgcli.run_cli()
File "/usr/lib/python3/dist-packages/pgcli/main.py", line 788, in run_cli
return [self.escape_name(name) for name in names]
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/pgcli/pgcompleter.py", line 131, in escape_name
text = self.prompt_app.prompt()
^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/prompt_toolkit/shortcuts/prompt.py", line 1034, in prompt
(not self.name_pattern.match(name))
TypeError: cannot use a string pattern on a bytes-like object
return self.app.run(
^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/prompt_toolkit/application/application.py", line 978, in run
return loop.run_until_complete(
^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/asyncio/base_events.py", line 653, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/prompt_toolkit/application/application.py", line 885, in run_async
return await _run_async(f)
^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/prompt_toolkit/application/application.py", line 743, in _run_async
self._redraw()
File "/usr/lib/python3/dist-packages/prompt_toolkit/application/application.py", line 557, in _redraw
self.context.copy().run(run_in_context)
File "/usr/lib/python3/dist-packages/prompt_toolkit/application/application.py", line 540, in run_in_context
self.renderer.render(self, self.layout)
File "/usr/lib/python3/dist-packages/prompt_toolkit/renderer.py", line 640, in render
layout.container.preferred_height(size.columns, size.rows).preferred,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/prompt_toolkit/layout/containers.py", line 326, in preferred_height
dimensions = [
^
File "/usr/lib/python3/dist-packages/prompt_toolkit/layout/containers.py", line 327, in <listcomp>
c.preferred_height(width, max_available_height) for c in self._all_children
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/prompt_toolkit/layout/containers.py", line 796, in preferred_height
return self.content.preferred_height(width, max_available_height)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/prompt_toolkit/layout/containers.py", line 326, in preferred_height
dimensions = [
^
File "/usr/lib/python3/dist-packages/prompt_toolkit/layout/containers.py", line 327, in <listcomp>
c.preferred_height(width, max_available_height) for c in self._all_children
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/prompt_toolkit/layout/containers.py", line 2642, in preferred_height
if self.filter():
^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/prompt_toolkit/filters/base.py", line 210, in __call__
return self.func()
^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/prompt_toolkit/shortcuts/prompt.py", line 168, in has_before_fragments
for fragment, char, *_ in get_prompt_text():
^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/prompt_toolkit/shortcuts/prompt.py", line 1279, in _get_prompt
return to_formatted_text(self.message, style="class:prompt")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/prompt_toolkit/formatted_text/base.py", line 81, in to_formatted_text
return to_formatted_text(value(), style=style)
^^^^^^^
File "/usr/lib/python3/dist-packages/pgcli/main.py", line 851, in get_message
prompt = self.get_prompt(prompt_format)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/pgcli/main.py", line 1115, in get_prompt
string = string.replace("\\H", self.pgexecute.host or "(none)")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: replace() argument 2 must be str, not bytes
postgres@pgsql:~$ ;1R
As you see, there are two type errors, and both relate to mixing str and bytes.
After poking a bit, it seems that when I give another database as an argument, pgcli connects to it and then makes queries to the postgres database to get the unix socket configuration and other stufs from the pg_settings database. In the case of a connection to the postgres database, the cursor fetches strings (eg in pgexecute.get_socket_directory function), while when connected to another database, the cursor fetches bytes.
I think some sanitizing is needed.
Your environment
- Please provide your OS and version information. Debian 12
- Please provide your CLI version. 3.5.0
- What is the output of
pip freezecommand: nothing, I don't use pip. psycopg version is 3.1.7
- Langage dominant
- Python
- Étoiles
- 13.4k
- Forks
- 610
- Merge moyen
- 14 min
- PR mergées (30 j)
- 2
Préparer son environnement
- Fournit un Dockerfile ou un fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de dbcli/pgcli
-
# is not as -- in PostgreSQLPeut-être pris @DiegoDAF l’a pris il y a 23 jours. Ouverte
Difficulté 3/5 1-2 jours Accessibilité débutants 64/100
dbcli/pgcli#1646 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Replace the pgclirc ConfigObj parser while preserving configuration compatibilityPeut-être pris @jackwalkerlabs l’a pris il y a 33 jours. Ouverte
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 3/5 1-2 jours Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
Feature Request: show service name in promptPeut-être pris @jackwalkerlabs l’a pris il y a 37 jours. Ouverte
Difficulté 3/5 1-2 jours Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 3/5 1-2 jours Accessibilité débutants 55/100
dbcli/pgcli#1608 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de dbcli/pgcli
Issues similaires
-
customer-reported question
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
Azure/azure-sdk-for-python#49548 · 1 commentaire · 1 réaction ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
btclib-org/btclib-wallet#409 ·
Les mainteneurs répondent en général sous 1 jour
-
Phase 2 PSA Capability & Career Profile
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
bcgov/digital-journeys#2310 ·
-
bug good first issue
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
fastmachinelearning/hls4ml#1582 ·
Les mainteneurs répondent en général sous 3 jours
-
Sort modelsOuverteenhancement good first issue
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
Les mainteneurs répondent en général sous 1 jour