这样的限制有个小小的暗示:尽管大多数的操作系统的动态链接过程允许你装载任意数目的包含冲突(同名的)的函数名的共享库,实际上它们可能用某种有趣的方式修补这样的装载。例如,如果你定义了一个与内建于 Postgres 的函数同名的动态装载的函数,DEC OSF/1 的动态装载器会令 Postgres 调用它自己内部的函数而不是令 Postgres 调用你的函数。因此,如果你希望你的函数用于不同的体系,我们建议你不要重载 C 函数名。
我们可以用一个很聪明的技巧绕开上面提到的问题。因为重载 SQL 函数没有问题,所以你可以定义一套不同名的 C 函数,然后定义一套同名的 SQL 函数封装,这些 SQL 函数封装接收合适的参数类型并且调用对应的 C 函数。
另一个解决方法是避免使用动态装载,而是把你的函数和后端进行静态链接,并且把他们定义为 INTERNAL 函数。这样,函数必须有不同的 C 名称,但是可以定义为相同的 SQL 名称(当然它们的参数类型不同)。这个方法避免了 SQL 封装函数的过荷,付出的代价是制作一个客户化的后端可执行文件。(这个选项只有在 v6.5 和以后的版本中有,因为以前的版本要求内部函数与 SQL 函数有与 C 代码里的一样的名称。)