我正在尝试为 Linux 中的 firebird 创建一些简单的 UDF(使用 GCC 编译的 C 语言)。问题是,当我将“返回机制”设置为“通过引用”时,当我调用该函数时,服务器崩溃了。当它是“按价值”时,没有问题。
以下是我尝试用 C 编写的函数:
这个有效:
double round(double *);
double round(val)
double *val;
{
*val = *val * 100;
*val = (*val>= 0) ? (long)(*val + 0.5) : (long)(*val - 0.5);
*val = *val / 100;
return *val;
}
但是这个在调用时会导致服务器崩溃:
char * proper_case(str)
char * str;
{
return str;
}
以下是 DDL:
DECLARE EXTERNAL FUNCTION "ROUND"
DOUBLE PRECISION
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT 'round' MODULE_NAME 'my_udfs.so';
DECLARE EXTERNAL FUNCTION PROPCASE
CSTRING(10000)
RETURNS CSTRING(10000) FREE_IT
ENTRY_POINT 'proper_case' MODULE_NAME 'my_udfs.so';
我用以下方法调用第二个函数:
select propcase('abrakadabra') from rdb$database;
火鸟服务器崩溃,我得到的唯一错误消息是:
Statement failed, SQLSTATE = -902
Error reading data from the connection.
有人可以建议吗?任何帮助将不胜感激!
我忘记提供的唯一信息是我编译 .so 文件的方式(可能关键在这里):
gcc -c -O -fpic my_udf.c
ld -G my_udf.o -lm -lc -o my_udf.so
cp my_udf.so /usr/lib/firebird/2.1/UDF/my_udfs.so