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
これを解決する方法はありますか?
Postgres 11では、システムカタログでproisagg
がprokind
に置き換えられました 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以降はこの変更に対応するように更新されています。
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'
に置き換えます。
同じ問題があり、これらの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