我想在 Postgresql 中添加一些扩展函数,比如 max/min,但我找不到它们的源函数。谁能建议我应该查看源代码的哪一部分?谢谢,
这是一个例子。我有关系:模型(id int),其中模型是一堆 CAD 模型,每个模型都有一个 ID;我想找到所有 id>5 和 area>5 的模型。但我不想计算所有的人脸面积,所以我使用 having 子句只计算一个子集。这是查询:
select model.id, model.face_number
from
model
where
id>5
group by model.id
having
area(model.id)>5;
我想将函数区域(oid)函数定义为 max/min 作为 FDW。但我不知道如何传递输入参数,所以我想将它与最小/最大进行比较。
最佳答案
这没有多大意义。
min
和 max
是聚合函数。它们将一组行缩减为单个值。
您的问题描述似乎与聚合没有太大关系。所以一点也不清楚聚合函数与它有什么关系。
如果你真的需要写聚合函数,从 PostgreSQL 手册开始:
- User-defined aggregates
- C-language extension functions
- Writing extensions
- Extension-building infrastructure
我强烈建议您使用 PL/PgSQL 或其他过程语言为聚合函数制作原型(prototype)。仅当您证明它可以使用更易于使用的语言工作并且确定您需要它比使用 PL/PgSQL 或 PL/Python 或其他语言更快时,才用 C 编写它。
无论如何,如果你想找到最小/最大的实现,从这里开始:
select a.*, so.oprname as aggsortopname, tt.typname as aggtranstypename
from pg_aggregate a
inner join pg_proc p on (a.aggfnoid = p.oid)
inner join pg_type tt on (a.aggtranstype = tt.oid)
inner join pg_operator so on (a.aggsortop = so.oid)
where p.proname = 'max';
您会看到聚合由多个部分组成:转换函数、排序运算符、过渡状态类型 、可选的 final 函数 等。有关用户定义聚合的文档对此进行了详细解释。
所以没有单一的“最大函数”。 pg_proc.h
中max
的定义实际上只是引用了一个伪函数。
所以对于max(int4)
,它被定义为转换函数int4larger
(src/backend/utils/adt/int.c
) 在转换类型 int4
上,使用排序运算符 >
,没有最终函数。
关于postgresql - 如何向 PostgreSQL 添加自定义聚合函数(例如 MAX/MIN)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26182721/