web-dev-qa-db-ja.com

PostgreSQL 11エラー:列p.proisaggが存在しません

phpPgAdmin v5.6およびPostgreSQL v11.2CentOS v7を使用して、Functionsスキーマ内のpublicタブにアクセスしようとすると、次のエラーが発生します。

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

同じエラーが発生するpsqlで\dfメタコマンドを使用する(結局のところ、バージョン10.1):

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=>

これらのクエリのエラーは、pg_procスキーマのpg_catalogテーブルからの列であるproisaggへの参照が原因であるようですが、PostgreSQL 11には存在しません。参照: https://www.postgresql。 org/docs/11/release-11.html

これを解決する方法はありますか?

8

Postgres 11では、システムカタログでproisaggprokindに置き換えられました pg_proc

prokind | char | fは通常の関数、pはプロシージャ、aは集約関数、またはwはウィンドウ関数

クエリを調整する必要があります。お気に入り:

SELECT ...
FROM pg_catalog.pg_proc p
 ...
WHERE p.prokind = 'f'   -- to only get plain functions
...

関連:

Psqlの\dfメタコマンドから観察されたエラーは、おそらく古いバージョンのpsqlを使用していることが原因です。もちろん、psql 11以降はこの変更に対応するように更新されています。

6

phpPgAdminの場合、\classes\database\Postgres.php内のエラーのあるクエリを変更する必要があります。

pg_proc.proisagg (PostgreSQL 10以前)は、関数が集約関数である場合、TRUEに設定されたブール値です。

pg_proc.prokind (PostgreSQL 11)は、値「f」、「p」、「a」、または「w」を取る文字です(上記のアーウィンの回答を参照)。

したがって、WHERE NOT p.proisagg(関数はではない集約関数)が出現するたびに、WHERE p.prokind <> 'a'に置き換えます。

3

同じ問題があり、これらの2つのコマンドを実行して修正しました

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