Luk*_*der 6 sql postgresql stored-procedures plpgsql function-parameter
我偶然发现了一个好奇的函数签名pg_catalog.pg_stat_get_activity:
CREATE OR REPLACE FUNCTION pg_stat_get_activity(
IN pid integer,
OUT datid oid,
OUT pid integer,
-- more parameters...)
RETURNS SETOF record AS 'pg_stat_get_activity'
LANGUAGE internal STABLE
COST 1
ROWS 100;
Run Code Online (Sandbox Code Playgroud)
此函数声明两次相同的参数名称,也会从中报告information_schema.
select
parameter_mode,
parameter_name
from information_schema.parameters
where specific_schema = 'pg_catalog'
and specific_name like 'pg_stat_get_activity%'
order by ordinal_position
Run Code Online (Sandbox Code Playgroud)
上面的产量(另见这个SQLFiddle):
+--------------+----------------+
|parameter_mode|parameter_name |
+--------------+----------------+
|IN |pid |
|OUT |datid |
|OUT |pid |
|... |... |
+--------------+----------------+
Run Code Online (Sandbox Code Playgroud)
天真地,我尝试创建一个类似的功能,但没有用:
CREATE FUNCTION f_2647(p1 IN int, p1 OUT int)
AS $$
BEGIN
p1 := p1;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我的问题:
pg_stat_get_activity函数重新声明两次相同的参数名称?这是为了什么目的?例如,为什么不只是使用INOUT参数?pg_stat_get_activity功能与我的有什么不同?为什么我不能使用这种语法?我注意到它出现在9.2中。在 9.1 版本中,out 字段被命名为procpid:
参数模式 | 参数名称 ----------------+------------------ 在| PID 输出 | 数据 输出 | 进程进程ID 输出 | 使用系统ID ...
寻找 postgres git 历史记录中的更改会导致此提交:
提交 4f42b546fd87a80be30c53a0f2c897acb826ad52
作者:马格努斯·哈甘德
日期: 2012 年 1 月 19 日星期四 14:19:20 +0100
将 pg_stat_activity 中的状态与查询字符串分开
这将状态(运行/空闲/空闲事务等)分为
它有自己的字段(“状态”),并留下仅包含的查询字段
查询文本。
当查询运行时,查询文本现在将表示“当前查询”
以及其他州的“最后查询”。据此,该领域已
从 current_query 重命名为 query。
由于向后兼容性无论如何都被破坏了,所以 procpid
字段也已重命名为 pid - 以及中的相同字段
pg_stat_replication 用于一致性。
Scott Mead 和 Magnus Hagander,评论 Greg Smith 的作品
在更改的行中,以下是有趣的一行:
-DATA(插入 OID = 2022 ( pg_stat_get_activity PGNSP PGUID 12 1 100 0 0 fffts 1 0 2249 "23" "{23,26,23,26,25,25,16,1184,1184,1184,869,25,23 }" "{i,o,o,o,o,o,o,o,o,o,o,o,o}" "{pid,datid,procpid,usesysid,application_name,current_query,等待,xact_start,query_start ,backend_start,client_addr,client_hostname,client_port}" _null_ pg_stat_get_activity _null__ null__ null_ ));
+DATA(插入 OID = 2022 ( pg_stat_get_activity PGNSP PGUID 12 1 100 0 0 ffffts 1 0 2249 "23" "{23,26,23,26,25,25,25,16,1184,1184,1184,1184,869 ,25,23}" "{i,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{pid,datid,pid,usesysid,application_name ,状态,查询,等待,xact_start,query_start,backend_start,state_change,client_addr,client_hostname,client_port}" _null_ pg_stat_get_activity _null_ _null_ _null_ ));
在这种预先消化的形式中,作者似乎没有注意到 的双重使用pid,或者他们并不关心,因为它在实践中是无害的。
它被允许通过,因为这些内部函数是通过initdb跳过普通用户函数的创建检查的快速路径创建的。