Utilisation de phpPgAdmin v5.6 et PostgreSQL v11.2 sur CentOS v7 , lorsque j'essaie d'accéder à l'onglet Functions
dans le schéma public
, j'obtiens l'erreur suivante:
ERROR: column p.proisagg does not exist
LINE 18: WHERE NOT p.proisagg
^
HINT: Perhaps you meant to reference the column "p.prolang".
Dans l'instruction :
SELECT
p.oid AS prooid,
p.proname,
p.proretset,
pg_catalog.format_type(p.prorettype, NULL) AS proresult,
pg_catalog.oidvectortypes(p.proargtypes) AS proarguments,
pl.lanname AS prolanguage,
pg_catalog.obj_description(p.oid, 'pg_proc') AS procomment,
p.proname || ' (' || pg_catalog.oidvectortypes(p.proargtypes) || ')' AS proproto,
CASE WHEN p.proretset THEN 'setof ' ELSE '' END || pg_catalog.format_type(p.prorettype, NULL) AS proreturns,
u.usename AS proowner
FROM pg_catalog.pg_proc p
INNER JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
INNER JOIN pg_catalog.pg_language pl ON pl.oid = p.prolang
LEFT JOIN pg_catalog.pg_user u ON u.usesysid = p.proowner
WHERE NOT p.proisagg
AND n.nspname = 'public'
ORDER BY p.proname, proresult
Fatal error: Call to a member function recordCount() on integer in /mnt/webdata/websites/applications/pga/classes/Misc.php on line 1949
J'obtiens la même erreur en utilisant le \df
méta-commande dans psql (version 10.1 en fait):
ts_d=> \df
ERROR: column p.proisagg does not exist
LIGNE 6 : WHEN p.proisagg THEN 'agg'
^
ASTUCE : Perhaps you meant to reference the column "p.prolang".
ts_d=>
L'erreur dans ces requêtes semble être due à une référence à proisagg
, une colonne originaire de pg_proc
table dans le pg_catalog
schéma, mais qui n'existe plus dans PostgreSQL 11. Voir: https://www.postgresql.org/docs/11/release-11.html
Une façon de résoudre ce problème?
Dans Postgres 11 proisagg
a été remplacé par prokind
dans le catalogue système pg_proc
:
prokind
|char
|f
pour une fonction normale,p
pour une procédure,a
pour une fonction d'agrégation, ouw
pour une fonction de fenêtre
La requête doit être adaptée. Comme:
SELECT ...
FROM pg_catalog.pg_proc p
...
WHERE p.prokind = 'f' -- to only get plain functions
...
En relation:
L'erreur que vous avez constatée à partir du \df
la méta-commande dans psql est probablement due à l'utilisation d'une version obsolète de psql. psql 11 et les versions ultérieures sont bien sûr mises à jour pour faire face à ce changement.
Dans le cas de phpPgAdmin , vous devez modifier les requêtes défectueuses dans \classes\database\Postgres.php
.
pg_proc.proisagg (PostgreSQL 10 et versions antérieures) est un ensemble booléen défini sur TRUE lorsque la fonction est une fonction d'agrégation.
pg_proc.prokind (PostgreSQL 11) est un caractère prenant les valeurs 'f', 'p', 'a' ou 'w' (voir la réponse d'Erwin ci-dessus).
Ainsi, pour chaque occurrence de WHERE NOT p.proisagg
(la fonction est pas une fonction d'agrégation), remplacez par WHERE p.prokind <> 'a'
.
J'ai eu le même problème et j'ai exécuté ces 2 commandes pour le résoudre
sed -i "s/NOT pp.proisagg/pp.prokind='f'/g" /usr/share/phpPgAdmin/classes/database/Postgres.php
sed -i "s/NOT p.proisagg/p.prokind='f'/g" /usr/share/phpPgAdmin/classes/database/Postgres.php