PostgreSQL 动态更新 C 语言函数

PostgreSQL 对于 C 语言编写的函数(包括其余与 C 语言兼容的语言,如 C++、Rust 等),是动态装载的,用 CREATE FUNCTION 建立完函数后,并不会当即装载,而是有链接创建以后,客户端第一次调用时才会进行装载,并且是装入到会话进程的内存里面去了。这时候,就算咱们把 .so 文件删除,若是会话以前已调过一次函数的话,客户端仍是能够继续调用函数的。sql

若是咱们改写了函数代码,从新生成了 .so 文件,把新的 .so 文件覆盖老版本的 .so 文件,这时候在已有的会话里调用函数的话,有时候会报函数版本错误“ERROR unrecognized function API version, sql status: XX000”;有时候更严重,会致使当前会话的进程 Segment Fault,致使整个 PostgreSQL 崩溃而重启。这时候就算用 CREATE OR REPLACE FUNCTION 来从新装载函数也不行,也会致使 PostgreSQL 重启。函数

惟一可行的解决方案就是把 .so 文件版本化,每一个编译出来的 .so 文件加上版本号,每一个版本的文件都不一样,把新版本的文件拷到 PKGLIBDIR 下,再用 CREATE OR REPLACE FUNCTION 替换掉老版本的函数,这样就算在已创建的会话里调用时,也是调的新版本的函数了。老版本的 .so 文件也能够删除了。code