PostgreSQL 11 错误:列 p.proisagg 不存在

Séb*_*ent 12 postgresql functions centos-7

CentOS v7上使用phpPgAdmin v5.6PostgreSQL v11.2,当我尝试访问架构中的选项卡时,出现以下错误:Functionspublic

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
Run Code Online (Sandbox Code Playgroud)

使用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=>
Run Code Online (Sandbox Code Playgroud)

这些查询中的错误似乎是由于引用proisagg了最初来自架构pg_proc中表的列pg_catalog,但在 PostgreSQL 11 中不再存在。请参阅:https : //www.postgresql.org/docs/11/release -11.html

有什么办法可以解决这个问题?

Erw*_*ter 9

在 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
...
Run Code Online (Sandbox Code Playgroud)

有关的:

您从\dfpsql 中的元命令观察到的错误很可能是由于使用了过时的 psql 版本。当然,psql 11 及更高版本已更新以应对此更改。


Séb*_*ent 5

对于phpPgAdmin,您必须修改\classes\database\Postgres.php.

pg_proc.proisagg(PostgreSQL 10 及之前版本)是一个布尔值,当函数是聚合函数时设置为 TRUE。

pg_proc.prokind (PostgreSQL 11) 是一个字符,取值为“f”、“p”、“a”或“w”(参见上面 Erwin 的答案)。

因此,对于每次出现WHERE NOT p.proisagg(函数不是聚合函数),请替换为WHERE p.prokind <> 'a'