我正在尝试在Linux上使用GCC编译一些简单的firebird UDF(用户定义函数)。问题是,当我将“返回机制”设置为“按引用”时,调用该函数会导致服务器崩溃。当它是“按值”时,就没有问题。
以下是我尝试用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
EXPORT
的定义本来就是什么也不做。我建议您还应该通过Firebird-devel邮件列表https://lists.sourceforge.net/lists/listinfo/firebird-devel联系Firebird核心开发人员。 - Mark Rotteveel