web-dev-qa-db-fra.com

Erreur PostgreSQL 11: la colonne p.proisagg n'existe pas

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?

8

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, ou w 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.

6

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'.

3

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
2
pgpt1